2

undefinedphp中的数据类型是什么?另外,如何检查它(在变量上,是否未定义)?

4

6 回答 6

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

活生生的例子

两者issetcompact技巧也同时适用于多个变量(使用逗号分隔的列表)。

null在处理数组键时,您可以轻松区分值和完全缺失:

$array = array('nullKey' => null);

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

活生生的例子

在处理对象属性时,也有property_exists,这相当于array_key_exists对象。

于 2013-01-14T00:18:24.697 回答
3

不,未定义不是 PHP 中的数据类型。null您检查是否在 PHP中设置了变量(即以前定义的和未定义的) isset()

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

从文档中,isset()将:

确定变量是否已设置且不为 NULL。

于 2013-01-14T00:17:13.347 回答
3

NULL是未定义变量的隐含值。isset将不起作用,因为它忽略了初始化为=NULL.

要探测变量是否真的存在,您必须使用一种解决方法:

if (in_array("varname", array_keys(get_defined_vars()))) {
于 2013-01-14T00:20:49.523 回答
2

要检查是否定义了变量,您可以尝试以下操作:

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

另外据我所知,“未定义”不是 PHP 中的数据类型。

于 2013-01-14T00:17:49.687 回答
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 或任何编程语言中的有效数据类型,则需要能够使用变量,因为本质上......它们已经在使用中

于 2013-01-14T00:21:39.807 回答
0

(可能有点过头了)

这是模仿您自己的未定义类型的两种相当“简单”的方法。由于函数调用的一些开销,它可以在您的代码中使用,而无需使用关键字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 中创建单例设计模式

于 2013-04-18T22:42:26.887 回答