为对象定义if语句

时间:2014-08-03 13:02:34

标签: php arrayaccess

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

if($class)

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

if(count($class))

有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

鉴于您正在实现一个类,也许您可​​以拥有一个计算数组中元素的成员?类似的东西:

class MyClass {

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

    ...

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

    ...
}

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

答案 2 :(得分:1)

不可能

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

检查答案here

答案 3 :(得分: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 */ }