Объявление типов переменных в PHP? - PullRequest
45 голосов
/ 24 декабря 2008

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

function blah(Bur $bur) {}

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

  1. Действительно ли это накладывает какие-либо ограничения на тип переменной, которую я могу передать методу бла?
  2. Если это только для того, чтобы помочь IDE, это нормально для меня. Как я могу объявить тип переменной в PHP, если я не в функции?

Ответы [ 5 ]

68 голосов
/ 24 декабря 2008

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

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

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

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

РЕДАКТИРОВАТЬ: Этот последний абзац не применяется с PHP 5.1; теперь вы можете использовать NULL в качестве значения по умолчанию, даже с подсказкой типа.

РЕДАКТИРОВАТЬ: Вы также можете установить расширение SPL Type Handling , которое дает вам типы оболочки для строк, целых, чисел с плавающей запятой, логических и перечислений.

РЕДАКТИРОВАТЬ: Вы также можете использовать "массив", начиная с PHP 5.1, и "вызываемый", начиная с PHP 5.4.

РЕДАКТИРОВАТЬ: Вы также можете использовать "string", "int", "float" и "bool" начиная с PHP 7.0.

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

/**
 * @var string
 */
public $variable = "Blah";
7 голосов
/ 24 декабря 2008

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

6 голосов
/ 24 декабря 2008

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

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


с PHP.net:

bool settype (mixed & $ var, string $ type)

Параметры

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

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

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

3 голосов
/ 24 декабря 2008

Это накладывает какие-либо ограничения на тип переменной, которую я могу передать методу бла?

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

Как я могу объявить тип переменной в PHP, если я не в функции?

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

...