Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从empty()函数调用_isset()magic方法,magic方法返回true,但实际上应该返回false_Php_Oop_Magic Methods - Fatal编程技术网

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";
}