undefined
php中的数据类型是什么?另外,如何检查它(在变量上,是否未定义)?
6 回答
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
对象。
不,未定义不是 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';
}
?>
另外据我所知,“未定义”不是 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 似乎都很棘手。
为了使对象评估为布尔值 false,第二个解决方案使用PHP 处理SimpleXMLElement 对象的方式进行破解。但是,如果某些代码更改了undef2对象的 XML 值,那么同样的 hack 可能会适得其反。
可悲的是,神奇的函数 __ toString()在扩展 SimpleXMLElement 类时变得毫无用处。也许还有另一个要重载的函数将返回一个自定义字符串,但我找不到它。虽然也许一个空字符串实际上更实用。
有PECL 运算符重载可能会使undef1类评估为布尔值 false,但扩展是 beta 版,可能不适用于您的 PHP 代码。
杂项说明:
似乎未定义的类型对于实现 ArrayAccess 的自定义类很有意义,其中可以:
- 如果$value === undefined则忽略元素的创建
- 如果未定义键或索引,则返回undefined
在上面的示例中,该类不限于单例。如果你愿意,你可以让它表现得这样: 在 PHP5 中创建单例设计模式