我遇到了一个奇怪的问题。我在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>
答案 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()
但要了解可能存在的实际问题,原帖和其他答案中的评论会有所帮助。