Php 可以实现空()的对象处理

Php 可以实现空()的对象处理,php,interface,is-empty,Php,Interface,Is Empty,我知道我们可以实现PHP的countable接口来确定函数count()的工作方式,以及使用对象(如数组)的迭代器接口 是否可以实现某种接口(或任何其他方式)来更改对象上empty()的行为 基本上,这就是我希望能够做到的: <?php class test { function __empty() { if (count($this->data) > 0) { return false; } re

我知道我们可以实现PHP的countable接口来确定函数count()的工作方式,以及使用对象(如数组)的迭代器接口

是否可以实现某种接口(或任何其他方式)来更改对象上empty()的行为

基本上,这就是我希望能够做到的:

<?php
class test {
    function __empty() {
        if (count($this->data) > 0) {
            return false;
        }
        return true;
    }
}

不,没有。迭代器行为和计数行为对对象没有意义;这就是为什么你可以覆盖它们。应用于对象的
empty()
的默认行为有一个含义:它是对象的实例还是空的?;这就是为什么无法覆盖它的原因

您可以改为:

  • 在对象内创建一个名为
    isEmpty()
    的方法,并在那里实现它
  • 创建一个全局函数
    emptyObj()
    ,并在那里实现它

    • 没有。PHP没有。您可以在上请求此功能。在此期间,你可以推出自己的

      interface Empty_Checkable{
         function isempty();
      }
      
      class test implements Empty_Checkable{
          function isempty() {
              if (count($this->data) > 0) {
                  return false;
              }
              return true;
          }
      }
      

      这不可能直接在对象上执行

      如果需要,我建议实现
      Countable
      接口,然后调用
      count($foo)==0,而不是调用
      empty($foo)

      但是,对于属性,可以使用两种神奇方法的组合:
      \uuu isset
      \uu get
      。例如:

      class Foo {
          protected $bar = false;
          protected $baz = true;
          public function __get($key) {
              return $this->$key;
          }
          public function __isset($key) {
              return isset($this->$key);
          }
      }
      
      这导致:

      empty($foo->abc); // true, isset returns false
      empty($foo->bar); // true, isset returns true, but get returns false value
      empty($foo->baz); // false, isset returns true, and get returns a true value
      

      因此,不,单用一个方法处理程序是不可能的,但通过两个神奇方法的组合,它可以很好地工作…

      可以实现可计数

      class MyCollection extends stdClass implements Serializable, ArrayAccess, Countable, Iterator, JsonSerializable
      {
          public function count() {
              return count($this->array);
          }
      }
      
      使用!count()而不是像


      “更改empty()的行为”不,编写自己的函数MY_empty()-是的,我认为没有,但我不确定我是否理解为什么PHP不会实现这个。我认为这将是一个非常简单的实现。所有类都有空方法,扩展类扩展了这个方法。特别是因为PHP修改了它,所以在对象上总是空的。我们可以编写自己的PHP版本来实现这一点:-)您需要访问该页面。在#php内部irc频道或邮件列表中查找有权访问或提出问题的人。顺便说一句,提出这样一个功能可能会被核心开发人员投反对票。这是不幸的,因为我正在开发一个库,它将从这个扩展中受益。您还可以编写自己的函数
      is_empty()
      实现您眼中的空或非空,然后使用它代替PHP版本的
      empty()
      @hakre问题是,对于未定义的内容,您将收到警告。@Tom,在检查它是否为空之前,您可以随时检查它是否为
      isset
      。使用后一种解决方案,您还可以使其不触发警告。@Jeffrey,empty的一个关键点是它检查isset。如果我必须调用isset,那么我自己的空函数。。。我们正在给自己制造更多的困难。在用户定义函数内调用isset是毫无意义的。@Tom,既然
      empty()
      已经满足了您的要求,那么为什么要重写它呢?这很有意义,但我不确定我是否明白为属性实现uu get或u_isset的意义,因为没有这些方法,isset或empty就可以正常工作。这正是OP开始提问的方式:“我知道我们可以实现PHP的可数接口[…]”。这是事实,但无论如何,我知道,这仍然是最好的解决方案。
      if (!count($myList)) {
          echo "List is empty!";
      }