Я пытался настроить автозаполнение Netbeans с помощью PHP, и я узнал, что этот код действителен в PHP:
function blah(Bur $bur) {}
Пара вопросов:






Это называется подсказкой типа, добавленное в PHP 5. Это не совсем то, чего вы можете ожидать, если вы переходите с такого языка, как Java. Это вызывает ошибку, если вы не передаете ожидаемый тип. Однако вы не можете использовать примитивы с подсказкой типа (нет int $ bur).
/**
* @var string
*/
public $variable = "Blah";
Не нужно тестировать. Согласно документации PHP «Невыполнение подсказки типа приводит к фатальной ошибке, которую можно отловить». ch2.php.net/language.oop5.typehinting
Я подтверждаю, он отлично работает с eclipse PDT, спасибо за упоминание "Большинство IDE могут сделать вывод ...".
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 не работает.
# 2: (...) Как я могу объявить тип переменной в PHP, если я не нахожусь в функции?
Недавно я слышал о "settype ()" и "gettype ()" в PHP4 и 5
.
Вы можете легко принудительно указать тип переменной в любое время
Из PHP.net:
bool settype (смешанный & $ var, string $ type)
Параметры
var: преобразовываемая переменная. type: Возможные значения типа:
[: D Первый визит, первый комментарий ...]
Да, я только что это видел. settype и gettype предназначены только для примитивов, что не помогает (хотя технически он отвечает на вопрос, поэтому я проголосую за вас. Пожалуйста, дайте ссылку на документ PHP и удалите его из своего ответа).
$myVar=(string) $variabel; дает строковую переменную. После этого присвойте значение.
Это указание типа работает только для проверки аргументов функции; вы не можете объявить, что переменная 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 удручают хаки, но это всего лишь мое предпочтение типизированных языков.
Там с вами согласны даже те из нас, кто не предпочитает строго типизированные языки :)
Хорошим шагом для PHP будет возможность объявить тип или оставить его динамическим. Я надеюсь увидеть, что в будущем PHP
Я немного не согласен или хочу уточнить первый EDIT: null никогда не имеет допустимого типа $ myClass (PHP 5.3). Возможно, он работает как параметр по умолчанию, но его все равно нельзя передать (как в Java), если используется подсказка типа в сигнатуре функции.
Фактически вы можете объявить myFunc(MyClass $x = NULL), а затем вызвать myFunc(NULL) или myFunc() без ошибок.
Мне очень нравится запрещение null для параметров с подсказками типа по умолчанию. Как вы говорите, Java позволяет это, и теперь они возятся с @Nullable и @NotNull. Я думаю, что реализация PHP очень помогает предотвратить ошибки нулевой ссылки.
PHP 7.2 также добавляет object
Жаль, что вы не можете указать массив объектов, например: functionName(int[] $someIds) или functionName(SomeObject[] $someObjects), но есть частичный обходной путь: stackoverflow.com/a/34273821/448816
Для разрешения нулевых значений вы также можете использовать function blah(?Bur $bur) {} (обратите внимание на ? перед Bur). См. stackoverflow.com/a/38129401/4284627.
что, если я не в классе? Переменная $ поступает из включенного PHP ... Я думаю, что я почти там, где мне нужно быть ...