1

有没有办法为在我的类实例上发出的 if 语句定义布尔返回值?我有一个实现数组访问接口等的类,但即使包装的数组为空:

if($class)

将始终返回 true,因为它是一个对象并且确实存在。我宁愿不必每次都发布:

if(count($class))

有什么办法可以做到这一点?

4

4 回答 4

2

如果我明白了,您可以实现可数接口;这需要您定义该count()方法,该方法让您知道(通过像这样使用它count($myArrayAccessInstance))您的内部数组是否有项目或您想要定义的任何逻辑。

class MyAy implements ArrayAccess, Countable
{
    private $data;

    public function offsetExists($key)
    {
         # code...
    }

    public function offsetUnset($key)
    {
         # code...
    }

    public function offsetGet($key)
    {
        # code...
    }

    public function offsetSet($key, $value)
    {
        $this->data[$key] = $key;
    }

    public function count()
    {
        return $this->data > 0;
    }
}

$my = new MyAy();

$my['user'] = "Ilpaijin";

if(count($my))
{
    var_dump($my);
}
于 2014-08-03T13:53:02.173 回答
1

鉴于您正在实现一个类,也许您可​​以有一个成员来计算数组中的元素?就像是:

class MyClass {

    public $numElems = 0;
    private $elems = array();

    ...

    public function add($elem)  {
        $elems[] = $elem;
        $numElems++;
    }

    ...
}

然后,if像 if($class->numElems) ...

于 2014-08-03T13:08:45.657 回答
1

不可能将对象转换为与类中的属性相关的布尔值,因为它总是会返回 true。但我认为你只需要在你的类中创建一个函数,允许你像这样返回你需要的布尔值

public function bool()
{
    return (count($this->array)>0);
}

当您需要使用它时,只需像这样调用该函数if ($obj->bool()) { ... },另一种使您的语句看起来像您一开始想要做的方法是定义一个具有非常短名称的类,我通常使用_,并且该函数应该返回你需要的布尔值就像这样

function _ ($Obj)
{
    return $Obj->bool();
}

最后,如果($class->bool())它有点长,而不是像这样对你的班级进行测试,你可以这样做

if (_($class))
{ /* do something fun */ }
于 2014-08-03T13:24:16.867 回答
1

这是不可能的

In PHP an object when cast to bool always produces true. There is no way of changing that.

在这里检查答案

于 2014-08-03T13:10:37.317 回答