undefined
是php中的数据类型吗?
另外,如何检查它(在变量上,是或未定义)?
答案 0 :(得分:5)
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
<强> Live example 强>
isset
和compact
技巧同时适用于多个变量(使用以逗号分隔的列表)。
在处理数组键时,您可以轻松区分null
值和完全不存在:
$array = array('nullKey' => null);
var_dump(isset($array['nullKey'])); // false
var_dump(array_key_exists($array, 'nullKey')); // true
<强> Live example 强>
在处理对象属性时,还有property_exists
,它相当于对象的array_key_exists
。
答案 1 :(得分:3)
不,undefined不是PHP中的数据类型。您可以使用isset()
检查PHP中是否设置了变量(即先前定义的而不是null
):
if( isset( $foo)) {
echo "Foo = $foo\n";
} else {
echo "Foo is not set!\n";
}
从文档中,isset()
将:
确定变量是否已设置且不为NULL。
答案 2 :(得分:3)
NULL
是未定义变量的隐含值。 isset
无效,因为它忽略了初始化为=NULL
的变量。
要探测变量是否真的存在,您必须使用变通方法:
if (in_array("varname", array_keys(get_defined_vars()))) {
答案 3 :(得分:2)
要检查变量是否已定义,您可以尝试:
<?php
if(isset($myvar)){
echo 'your variable is set as' . $myvar;
}else{
echo 'your variable is not set';
}
?>
据我所知,'undefined'不是PHP中的数据类型。
答案 4 :(得分:1)
没有未定义,但有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或任何编程语言中的有效数据类型,则需要能够使用变量,因为基本上......它们已经在使用中
答案 5 :(得分:0)
(可能有点过头了)
这是两种相当“简单”的方式来模仿您自己的 undefined 类型。通过函数调用的一些开销,您可以使用代码,而无需使用关键字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,第二个解决方案使用hack和PHP处理 SimpleXMLElement对象的方式。但是,如果某些代码改变了 undef2 对象的XML值,那么同样的hack会适得其反。
可悲的是,扩展SimpleXMLElement类时,魔术函数__ toString()变得ironically无效。也许有另一个重载函数会返回一个自定义字符串,但我找不到它。虽然可能是一个空字符串实际上更实用。
有PECL operator overloads可能会将 undef1 类评估为布尔值false,但扩展名为beta,可能无法用于PHP代码。
其他说明:
似乎 undefined 类型对于实现ArrayAccess的自定义类很有意义,它可以在以下位置:
在上面的示例中,类不限于单例。如果你愿意,你可以让它表现得那样: Creating the Singleton design pattern in PHP5