isset和空函数的奇怪行为

时间:2016-10-03 06:43:41

标签: php

我遇到了一个奇怪的问题。我在PHP中有以下简单的行

<?php
    echo "Value = ".$this->language; //outputs Value = en
    echo "<br>isset = ".isset($this->language);  //Outputs isset = 
    echo "<br>Is empty = ".empty($this->language);  //Outputs Is empty= 1 
?>

为什么第二行不打印true或'1'而第三行打印为空,当它从第一行清除时this->language已设置且不为空? / p>

4 个答案:

答案 0 :(得分:1)

而不是'echo'使用var_dump.Will可以帮助您理解差异。

$language = 'en';
echo "Value = ".$language; //outputs Value = en
$isset = isset($language);
$empty = empty($language);
echo "<br>isset = ";;  
var_dump($isset); //bool(true)
echo "<br>Is empty = ";  
var_dump($empty); // bool(false)

答案 1 :(得分:1)

Code Snippet下面应该可以帮到你

如果在父类中将变量声明为私有,则它在子类中不可用,它必须是受保护的或私有的

class base {
   // changed to protected
   protected $language = 'en';
}

class child extends base {

  public function spit(){
     echo "Value = ".$this->language; //outputs Value = en
     echo "<br>isset = ".isset($this->language);  //Outputs isset = 
     echo "<br>Is empty = ".empty($this->language);  //Outputs Is empty= 1 
   }
}
$ch = new child();
$ch->spit();

答案 2 :(得分:1)

isset()的说明如下。

isset($this->language)将始终回应“错误”。因为isset()接受VARIABLES作为它的参数,但在这种情况下,$this->language不是VARIABLE。它是从类的__get()方法返回的VALUE。因此isset($this->language)表达式总是等于“假”。 请参阅http://php.net/manual/en/function.isset.php

empty()的说明如下。

class Registry
{
    //Definition goes here
}
$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // true, .. say what?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)); // false as expected

空($ registry-&gt; notEmpty)的结果有点意外,因为该值显然已设置且非空。这是因为在这些情况下empty()函数使用__isset()魔术函数。 请参阅http://php.net/manual/en/function.empty.php

答案 3 :(得分:0)

实际上,代码非常复杂,我正在使用的代码是使用Silverstripe构建的。但我发现一个肮脏的解决方法也适用于普通的PHP。

在父类中,我创建了一个方法来检查是否设置了语言,如此

public function isLanguageEmpty(){
        return isset($this->language);
    }

在儿童班中我们可以简单地使用$this->isLanguageEmpty()

但要了解可能存在的实际问题,原帖和其他答案中的评论会有所帮助。