Php 从empty()函数调用_isset()magic方法,magic方法返回true,但实际上应该返回false
我不明白为什么输出是Php 从empty()函数调用_isset()magic方法,magic方法返回true,但实际上应该返回false,php,oop,magic-methods,Php,Oop,Magic Methods,我不明白为什么输出是exist magic方法返回true,但实际上应该返回false,因为我已经设置了属性。看看您对字段使用的访问修饰符,它们都设置为private=无法直接从类外访问,因此您需要所谓的getter-: 嗯。我不得不承认这也让我有点吃惊 首先,让我们把重要的部分放在一边: 使用empty()和isset()可能是危险的,而且不是一种好的做法。由于这些语言构造不是类型安全的,并且在需要时强制值,因此结果可能会导致意外的错误。使用更具描述性和类型安全性的选项通常更安全。将默认值设
exist
magic方法返回true,但实际上应该返回false,因为我已经设置了属性。看看您对字段使用的访问修饰符,它们都设置为private=无法直接从类外访问,因此您需要所谓的getter-:
嗯。我不得不承认这也让我有点吃惊 首先,让我们把重要的部分放在一边:
- 使用
和empty()
可能是危险的,而且不是一种好的做法。由于这些语言构造不是类型安全的,并且在需要时强制值,因此结果可能会导致意外的错误。使用更具描述性和类型安全性的选项通常更安全。将默认值设置为空字符串或甚至isset()
,并与之进行比较,等等null
- 您问题中的代码看起来不太实用,我无法想象有多少这样的用例。通常,使用magic方法不是一个好主意,而使用类型化属性和/或类型化访问器(get/set方法)则不是一个好主意。我猜您正在尝试创建一个父类,在其中添加一些神奇的逻辑,其他继承类将利用这些逻辑,这很好。。。但我并不特别喜欢
- 您的
实现本身就有缺陷,因为它对属性调用\uu isset()
。想想看:当empty()
返回empty()
(该属性不是空的)时,false
也返回\uu isset()
。与你所期望的相反。修复很简单,只需返回相反的:false
return!空($this->$property)代码>
empty()
将调用神奇的方法\uu isset()
(如果已定义)
如果\uu isset()
返回false
,empty()
返回true。如果\uu-isset()
返回true
,则检查\uu-get()
中的值是否为“false”(例如,空字符串、0
、'0'
、null
、false
或空数组都将返回true
)。但是如果magic\uu get()
不存在,则该值不可访问,并且empty()
返回true
因此,您还需要定义magic访问器\uu get()
。您的类“固定”将相当于:
请注意,您需要两种方法。仅定义magic getter也会失败,因为
empty()
首先调用magic\uu isset()
,然后(如果它返回true
)magic getter将返回false,因为该值不是空的。是的,它应该返回false,但它返回True。但是,如果我们在类外使用空函数调用私有属性,那么它将自动调用_uisset()方法,该方法应该返回false…如果不使用get方法,则无法解决此问题或进行明确解释。如答案中所述,您需要为您的工作方法定义\uuu get()
魔术方法。是的,我接受您的解决方案,但它是否有任何明确的解释,为什么它会这样。我的回答中解释了这一点:empty()
调用\uu isset()
和\uu get()
。它是这样工作的,因为empty()
需要访问属性的值来进行比较,因为它将为多个不同的值(空字符串、null、未定义、false
、0
等)返回true
。为什么会这样?因为它是这样设计的。但如果未声明变量,empty()也会返回true。
class Base
{
private $firstName;
private $lastName;
function setName($firstName, $lastName){
$this->firstName = $firstName;
$this->lastName = $lastName;
}
function __isset($property){
return empty($this->$property);
}
}
$ob = new Base();
$ob->setName("Hello", "world");
if (empty($ob->firstName)) {
echo "exist";
} else {
echo "not exist";
}
// Output: exist
class Base{
private $firstName;
private $lastName;
function setName($firstName, $lastName){
$this->firstName = $firstName;
$this->lastName = $lastName;
}
function getFirstName (){
return $this->firstName;
}
function getLastName (){
return $this->lastName;
}
function __isset($property){
return empty($this->$property);
}
}
$ob = new Base();
$ob->setName("Hello", "world");
if(empty($ob->getFirstName())){
echo "exist";
}
else{
echo "not exist";
}
class Base
{
private $firstName;
private $lastName;
function setName($firstName, $lastName){
$this->firstName = $firstName;
$this->lastName = $lastName;
}
function __isset($property){
return !empty($this->$property);
}
function __get($property) {
return $this->$property;
}
}
$ob = new Base();
$ob->setName("Hello", "world");
if(empty($ob->firstName)){
echo "empty";
}
else{
echo "not empty";
}