Php 可以实现空()的对象处理
我知道我们可以实现PHP的countable接口来确定函数count()的工作方式,以及使用对象(如数组)的迭代器接口 是否可以实现某种接口(或任何其他方式)来更改对象上empty()的行为 基本上,这就是我希望能够做到的: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
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!";
}