5

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

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

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

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

很高兴拥有!

4

4 回答 4

5

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

您可以改为:

  • 在被调用的对象内创建一个方法isEmpty()并在那里实现它
  • 创建一个全局函数emptyObj()并在那里实现它
于 2013-01-28T18:54:06.740 回答
4

不,PHP 没有它。您可以在wiki.php.net上请求此类功能。与此同时,您可以自己滚动。

interface Empty_Checkable{
   function isempty();
}

class test implements Empty_Checkable{
    function isempty() {
        if (count($this->data) > 0) {
            return false;
        }
        return true;
    }
}
于 2013-01-28T18:54:10.103 回答
3

直接在对象上是不可能的。

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

但是,对于属性,可以使用两种魔术方法的组合:__isset__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

所以不,使用单个方法处理程序是不可能的,但是结合两种魔术方法,它可以正常工作......

于 2013-01-28T19:48:57.450 回答
0

可以实现 Countable

class MyCollection extends stdClass implements Serializable, ArrayAccess, Countable, Iterator, JsonSerializable
{
    public function count() {
        return count($this->array);
    }
}

并使用 !count() 而不是 empty() 之类的

if (!count($myList)) {
    echo "List is empty!";
}
于 2017-10-19T12:45:56.037 回答