Не undefined
ли тип данных в 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, где можно:
В приведенном выше примере класс не ограничен одноэлементным. Вы можете заставить его вести себя таким образом, если хотите: Создание шаблона проектирования Singleton в PHP5