【问题标题】:Possible to implement object handling of empty()可以实现empty()的对象处理
【发布时间】:2013-01-28 18:48:44
【问题描述】:

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

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

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

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

很高兴拥有!

【问题讨论】:

  • "改变 empty() 的行为" 不,写你自己的函数叫做 MY_empty() - 是的
  • 我觉得没有,但我不确定我理解为什么 PHP 不会实现这个。我认为这将是一个非常简单的实现。所有类都有 __empty 方法,扩展类扩展了它。特别是因为 PHP 对其进行了修改,所以空对象在对象上总是错误的。
  • 随意编写自己的 php 版本来执行此操作 :-)

标签: php interface is-empty


【解决方案1】:

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

您可以改为:

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

【讨论】:

  • 你也可以编写你自己的函数is_empty()来实现你眼中的空或非空,然后用它来代替PHP版本的empty()
  • @hakre 问题是您将收到未定义的警告。
  • @Tom,您可以随时检查它是否为isset,然后再检查它是否为空。也可以使用后一种解决方案,使其不会触发警告。
  • @Jeffrey,empty 的关键点之一是它检查 isset。如果我必须调用 isset 那么我自己的空函数......我们让自己变得更加困难。在用户定义的函数中调用 isset 是没有意义的。
  • @Tom,既然empty() 已经完成了您的要求,为什么还要覆盖它?
【解决方案2】:

没有。 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;
    }
}

【讨论】:

  • 您需要访问该页面。在#php-internal irc 频道或邮件列表中查找有权访问或提出问题的人。
  • 顺便说一句,提出这样的功能可能会被核心开发人员投票否决。这很不幸,因为我正在开发一个可以从这个扩展中受益的库。
【解决方案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

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

【讨论】:

  • 这是有道理的,但我不确定我是否明白为属性实现 __get 或 __isset 的意义,因为没有这些方法,isset 或 empty 也能正常工作。
【解决方案4】:

可以实现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!";
}

【讨论】:

  • 这正是 OP 提出问题的方式:“我知道我们可以实现 PHP 的可数接口 [...]”。
  • 确实如此,但据我所知,它仍然是最好的解决方案。
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2018-06-02
  • 2013-08-08
  • 2011-04-12
  • 2019-04-29
  • 1970-01-01
相关资源
最近更新 更多