为对象定义if语句


define if statement for object

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

if($class)

将始终返回true,因为它是一个对象并且确实存在。我不希望每次都发出

if(count($class))

有办法做到这一点吗?

如果我明白了你可以实现可数接口;这需要您定义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);
}

假设你正在实现一个类,也许你可以有一个成员计数数组中的元素?比如:

class MyClass {
    public $numElems = 0;
    private $elems = array();
    ...
    public function add($elem)  {
        $elems[] = $elem;
        $numElems++;
    }
    ...
}

然后,执行if,如if($class->numElems)…

这是不可能的

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

点击这里查看答案

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

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

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

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

最后,不是像这样测试你的类如果($class->bool())有点长,你这样做

if (_($class))
{ /* do something fun */ }