Не определено ли тип данных в php?

Не undefined ли тип данных в php? Кроме того, как проверить его (по переменной, является или не определено)?

Related of "Не определено ли тип данных в php?"

В PHP нет «неопределенного» типа данных. Вы можете проверить, установлена ​​ли переменная, заданная с помощью isset , но это не может отличить переменную, которая не установлена ​​вообще и имеет null значение:

 var_dump(isset($noSuchVariable)); // false $nullVariable = null; var_dump(isset($nullVariable)); // also false 

Однако есть трюк, который вы можете использовать с compact который позволяет определить, была ли определена переменная, даже если ее значение равно null :

 var_dump(!!compact('noSuchVariable')); // false var_dump(!!compact('nullVariable')); // true 

Живой пример .

И isset и compact трюк также работают сразу для нескольких переменных (используйте список, разделенный запятыми).

Вы можете легко отличить null значение от общего отсутствия при работе с ключами массива:

 $array = array('nullKey' => null); var_dump(isset($array['nullKey'])); // false var_dump(array_key_exists($array, 'nullKey')); // true 

Живой пример .

При работе с объектными свойствами существует также property_exists , что эквивалентно array_key_exists для объектов.

Нет, undefined не является типом данных в PHP. Вы проверяете, установлена ​​ли переменная (т.е. определена ранее и не равна null ) в PHP с isset() :

 if( isset( $foo)) { echo "Foo = $foo\n"; } else { echo "Foo is not set!\n"; } 

Из документов, isset() будет:

Определите, установлена ​​ли переменная и не является NULL.

NULL – это неявное значение для неопределенных переменных. isset не будет работать, поскольку он игнорирует переменные, инициализированные до =NULL .

Чтобы проверить, действительно ли переменная присутствует, вы должны использовать обходной путь:

 if (in_array("varname", array_keys(get_defined_vars()))) { 

Чтобы проверить, определена ли переменная или нет, вы можете попробовать следующее:

 <?php if(isset($myvar)){ echo 'your variable is set as' . $myvar; }else{ echo 'your variable is not set'; } ?> 

Кроме того, насколько я знаю, «undefined» не является типом данных в PHP.

Нет неопределенного, но есть null значение. Но undefined не является допустимым типом данных, все переменные должны быть определены. От:

 $Foo = "Test"; if (isset($Foo)) { echo "Variable Is Defined"; } else { echo "Variable Is not Defined"; } if (isset($UndefinedVar)) { echo "Variable Is Defined"; } else { echo "Variable Is Not Defined"; } 

Ваши выходы для каждого оператора будут:

1) Определяется переменная

2) Переменная не определена


Если неопределенные переменные были допустимым типом данных в PHP или на каких-либо языках программирования, это потребовало бы способности работать с переменными, потому что существенно .. Они уже будут использоваться

(может быть немного выше)

Вот два довольно простых способа подражать вашему собственному неопределенному типу. С некоторыми накладными расходами для вызова функции он может быть доступен вашему коду без использования ключевого слова global .

 <?php class undef1{function __toString(){return 'undefined';}} function undef1(){ static $C; if($C===null){$C = new undef1();} return $C; } echo 'undef1 in string context : '; var_dump( undef1().''); echo 'undef1 in boolean context: '; var_dump( !!undef1() ); echo 'undef1 compared to itself: '; var_dump( (undef1() === undef1()) ); class undef2 extends SimpleXMLElement{function __toString(){return 'undefined';}} function undef2(){ static $C; if($C===null){$C = new undef2('<C/>');} return $C; } echo 'undef2 in string context : '; var_dump( undef2().''); echo 'undef2 in boolean context: '; var_dump( !!undef2() ); echo 'undef2 compared to itself: '; var_dump( (undef2() === undef2()) ); ?> 

вывод (PHP 5.3.23):

 undef1 in string context : string(9) "undefined" // :) undef1 in boolean context: bool(true) // :( undef1 compared to itself: bool(true) // :) undef2 in string context : string(0) "" // :( ? undef2 in boolean context: bool(false) // :) undef2 compared to itself: bool(true) // :) 

В любом случае кажется тихим, чтобы заставить вещи чувствовать себя как JavaScript.

Чтобы получить объект для вычисления boolean false, второе решение использует взломанный способ, с помощью которого PHP обрабатывает объекты SimpleXMLElement . Однако тот же самый хак может иметь неприятные последствия, если какой-то код изменяет значение XML вашего объекта undef2 .

К сожалению, магическая функция __ toString () становится иронически бесполезной при расширении класса SimpleXMLElement. Возможно, есть другая функция для перегрузки, которая вернет пользовательскую строку, но я не могу ее найти. Хотя, возможно, пустая строка на самом деле более практична.

Есть перегрузки операторов PECL, которые могли бы заставить класс undef1 оценивать значение boolean false, но расширение является бета-версией и может быть недоступно для вашего PHP-кода.

Разное:

Похоже, что неопределенный тип будет иметь большой смысл для пользовательских классов, которые реализуют ArrayAccess, где можно:

  • игнорировать создание элементов, если $ value === undefined
  • return undefined, если ключ или индекс не определены

В приведенном выше примере класс не ограничен одноэлементным. Вы можете заставить его вести себя таким образом, если хотите: Создание шаблона проектирования Singleton в PHP5