在PHP中未定义数据类型?

时间:2013-01-14 00:16:07

标签: php types undefined

undefined是php中的数据类型吗? 另外,如何检查它(在变量上,是或未定义)?

6 个答案:

答案 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

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

在处理数组键时,您可以轻松区分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的自定义类很有意义,它可以在以下位置:

  • 如果 $ value === undefined
  • ,则忽略元素的创建
  • 如果未定义键或索引,则返回 undefined

在上面的示例中,类不限于单例。如果你愿意,你可以让它表现得那样: Creating the Singleton design pattern in PHP5