Php 为对象定义if语句

Php 为对象定义if语句,php,arrayaccess,Php,Arrayaccess,有没有办法为类实例上发出的if语句定义布尔返回值? 我有一个实现数组访问接口等的类,但即使包装的数组为空: if($class) 将始终返回true,因为它是一个对象并且确实存在。 我不希望每次都发布一个: if(count($class)) 有什么方法可以实现这一点吗?鉴于您正在实现一个类,也许您可以有一个成员来计算数组中的元素?比如: class MyClass { public $numElems = 0; private $elems = array();

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

if($class)
将始终返回true,因为它是一个对象并且确实存在。 我不希望每次都发布一个:

if(count($class))

有什么方法可以实现这一点吗?

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

class MyClass {

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

    ...

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

    ...
}

然后,像if($class->numemems)那样执行
if

如果您正在实现一个类,那么您可能有一个成员来计算数组中的元素?比如:

class MyClass {

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

    ...

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

    ...
}
然后,像if($class->numElems)那样执行
if

这是不可能的

In PHP an object when cast to bool always produces true. There is no way of changing that.
检查答案这是不可能的

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);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }
当您需要使用它时,只需像这样调用函数
if($obj->bool()){…}
,另一种让您的语句看起来像您在开始时想要做的那样的方法是用一个非常短的名称定义一个类,我通常使用
,这个函数应该像这样返回您需要的布尔值

public function bool()
{
    return (count($this->array)>0);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }
最后,如果
($class->bool())
有点长,您可以这样做,而不是像这样在类上进行测试

public function bool()
{
    return (count($this->array)>0);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }

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

public function bool()
{
    return (count($this->array)>0);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }
当您需要使用它时,只需像这样调用函数
if($obj->bool()){…}
,另一种让您的语句看起来像您在开始时想要做的那样的方法是用一个非常短的名称定义一个类,我通常使用
,这个函数应该像这样返回您需要的布尔值

public function bool()
{
    return (count($this->array)>0);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }
最后,如果
($class->bool())
有点长,您可以这样做,而不是像这样在类上进行测试

public function bool()
{
    return (count($this->array)>0);
}
function _ ($Obj)
{
    return $Obj->bool();
}
if (_($class))
{ /* do something fun */ }

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

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

但是,每次修改包装的数组时,我都必须跟踪计数,或者使用(非常慢的)魔术方法来访问每次动态计算的属性。嗯,无论如何,我会记住:)@lpg最好实现并使用count方法:
public function count(){return count($elems);}
@lpg为什么要重新发明已经存在的东西?但是,每次修改包装的数组时,我都必须跟踪计数,或者使用(非常慢的)魔术方法来访问每次动态计算的属性。嗯,无论如何,我会记住:)@lpg最好实现并使用count方法:
public function count(){return count($elems);}
@lpg为什么要重新发明已经存在的东西?是的,是重复的,请关闭。是重复的,请关闭