Объявление типов переменных в PHP?

Я пытался настроить автозаполнение Netbeans с помощью PHP, и я узнал, что этот код действителен в PHP:

function blah(Bur $bur) {}

Пара вопросов:

  1. Действительно ли это накладывает какие-либо ограничения, какой тип переменной я могу передать методу blah?
  2. Если это просто для помощи IDE, меня это устраивает. Как я могу объявить тип переменной в PHP, если я не нахожусь в функции?
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
52
0
95 962
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это называется подсказкой типа, добавленное в PHP 5. Это не совсем то, чего вы можете ожидать, если вы переходите с такого языка, как Java. Это вызывает ошибку, если вы не передаете ожидаемый тип. Однако вы не можете использовать примитивы с подсказкой типа (нет int $ bur).

  1. Указание типа данных для параметра функции приведет к тому, что PHP выдаст уловимую фатальную ошибку, если вы передадите значение, не относящееся к этому типу. Обратите внимание, что вы можете указывать только типы для классов, но не примитивы, такие как строки или целые числа.
  2. Большинство IDE могут определить тип данных из комментария в стиле PHPDoc, если он предоставлен. например

/**
 * @var string
 */
public $variable = "Blah";

что, если я не в классе? Переменная $ поступает из включенного PHP ... Я думаю, что я почти там, где мне нужно быть ...

Dan Rosenstark 24.12.2008 10:13

Не нужно тестировать. Согласно документации PHP «Невыполнение подсказки типа приводит к фатальной ошибке, которую можно отловить». ch2.php.net/language.oop5.typehinting

Dan Rosenstark 24.12.2008 19:26

Я подтверждаю, он отлично работает с eclipse PDT, спасибо за упоминание "Большинство IDE могут сделать вывод ...".

TheFuquan 18.12.2015 00:42

Does this actually impose any limits on what type of variable I can pass to the blah method?

Это называется подсказка типа. Согласно документации PHP, на которую я только что ссылался, да, она накладывает ограничения на тип аргумента: "Несоблюдение подсказки типа приводит к неустранимой фатальной ошибке."

How can I declare the type of a variable in PHP if I'm not in a function?

Прочтите типаж. Вы не можете явно определить тип переменной в PHP, ее тип определяется контекстом, в котором она используется.

@ Джереми Рутен: на самом деле ссылка на type hinting не работает.

helle 25.07.2017 18:26

# 2: (...) Как я могу объявить тип переменной в PHP, если я не нахожусь в функции?

Недавно я слышал о "settype ()" и "gettype ()" в PHP4 и 5
. Вы можете легко принудительно указать тип переменной в любое время


Из PHP.net:

bool settype (смешанный & $ var, string $ type)

Параметры

var: преобразовываемая переменная. type: Возможные значения типа:

  • "логическое" (или, начиная с PHP 4.2.0, "булево")
  • "целое число" (или, начиная с PHP 4.2.0, "int")
  • "float" (возможно только с PHP 4.2.0, для более старых версий используйте устаревший вариант "double")
  • "нить"
  • "множество"
  • "объект"
  • "null" (начиная с PHP 4.2.0)

[: D Первый визит, первый комментарий ...]

Да, я только что это видел. settype и gettype предназначены только для примитивов, что не помогает (хотя технически он отвечает на вопрос, поэтому я проголосую за вас. Пожалуйста, дайте ссылку на документ PHP и удалите его из своего ответа).

Dan Rosenstark 24.12.2008 18:29
$myVar=(string) $variabel; дает строковую переменную. После этого присвойте значение.
Nick Oetjen 24.09.2020 19:10
Ответ принят как подходящий

Это указание типа работает только для проверки аргументов функции; вы не можете объявить, что переменная PHP всегда должна быть определенного типа. Это означает, что в вашем примере $ bur должен иметь тип Bur, когда вызывается "blah", но $ bur можно переназначить на значение, отличное от Bur, внутри функции.

Подсказка типа работает только для имен классов или интерфейсов; например, вы не можете объявить, что аргумент должен быть целым числом.

Один раздражающий аспект подсказки типов PHP, который отличается от Java, заключается в том, что значения NULL не допускаются. Поэтому, если вам нужна возможность передачи NULL вместо объекта, вы должны удалить подсказку типа и сделать что-то вроде этого в верхней части функции:

assert('$bur === NULL || $bur instanceof Bur');

Обновлено: Этот последний абзац не применяется, начиная с PHP 5.1; теперь вы можете использовать NULL как значение по умолчанию, даже с подсказкой типа.

Обновлено: Вы также можете установить расширение Обработка типов SPL, которое дает вам типы оболочки для строк, целых чисел, чисел с плавающей запятой, логических значений и перечислений.

Обновлено: Вы также можете использовать «массив», начиная с PHP 5.1, и «вызываемый», начиная с PHP 5.4.

Обновлено: Вы также можете использовать "string", "int", "float" и "bool", начиная с PHP 7.0.

Полный и отличный ответ. Я признаю, что мое основное внимание было направлено на то, чтобы получить подсказку в своей среде IDE, о чем я уже догадался здесь stackoverflow.com/questions/390192 ... лично я считаю, что многие аспекты PHP удручают хаки, но это всего лишь мое предпочтение типизированных языков.

Dan Rosenstark 24.12.2008 23:09

Там с вами согласны даже те из нас, кто не предпочитает строго типизированные языки :)

J Cooper 25.12.2008 00:20

Хорошим шагом для PHP будет возможность объявить тип или оставить его динамическим. Я надеюсь увидеть, что в будущем PHP

Dr Casper Black 04.03.2011 18:46

Я немного не согласен или хочу уточнить первый EDIT: null никогда не имеет допустимого типа $ myClass (PHP 5.3). Возможно, он работает как параметр по умолчанию, но его все равно нельзя передать (как в Java), если используется подсказка типа в сигнатуре функции.

Frank Nocke 03.07.2012 13:16

Фактически вы можете объявить myFunc(MyClass $x = NULL), а затем вызвать myFunc(NULL) или myFunc() без ошибок.

JW. 03.07.2012 18:47

Мне очень нравится запрещение null для параметров с подсказками типа по умолчанию. Как вы говорите, Java позволяет это, и теперь они возятся с @Nullable и @NotNull. Я думаю, что реализация PHP очень помогает предотвратить ошибки нулевой ссылки.

MazeChaZer 07.07.2016 13:52

PHP 7.2 также добавляет object

Jonathan 02.03.2018 22:10

Жаль, что вы не можете указать массив объектов, например: functionName(int[] $someIds) или functionName(SomeObject[] $someObjects), но есть частичный обходной путь: stackoverflow.com/a/34273821/448816

mikhail-t 02.08.2018 00:29

Для разрешения нулевых значений вы также можете использовать function blah(?Bur $bur) {} (обратите внимание на ? перед Bur). См. stackoverflow.com/a/38129401/4284627.

Donald Duck 26.06.2019 00:57

Другие вопросы по теме