PHP对象就像数组一样

时间:2010-01-05 17:05:35

标签: php arrays

我需要能够像这样设置我的对象:

$obj->foo = 'bar';

然后在设置之后我需要以下内容才能成为真实

if($obj['foo'] == 'bar'){
  //more code here
}

9 个答案:

答案 0 :(得分:17)

只需将implements ArrayAccess添加到您的班级并添加所需的方法:

  • 公共函数offsetExists($ offset)
  • 公共功能offsetGet($ offset)
  • public function offsetSet($ offset,$ value)
  • public function offsetUnset($ offset)

请参阅http://php.net/manual/en/class.arrayaccess.php

答案 1 :(得分:16)

尝试扩展ArrayObject

你还需要像Valentin Golev所提到的那样实施__get Magic Method

你的课程需要看起来像这样:

Class myClass extends ArrayObject {
    // class property definitions...
    public function __construct()
    {
        //Do Stuff
    }

    public function __get($n) { return $this[$n]; }

    // Other methods
}

答案 2 :(得分:15)

ArrayObject实现了ArrayAccess接口(以及更多)。使用ARRAY_AS_PROPS标志,它可以提供您正在寻找的功能。

$obj = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$obj->foo = 'bar';
echo $obj['foo'];

或者,您可以在自己的一个类中实现ArrayAccess接口:

class Foo implements ArrayAccess {
  public function offsetExists($offset) {
    return isset($this->$offset);
  }

  public function offsetGet($offset) {
    return $this->$offset;
  }

  public function offsetSet($offset , $value) {
    $this->$offset = $value;
  }

  public function offsetUnset($offset) {
    unset($this->$offset);
  }
}

$obj = new Foo;
$obj->foo = 'bar';
echo $obj['foo'];

答案 3 :(得分:9)

你必须实现ArrayAccess接口才能做到这一点 - 这只意味着实现了一些(4个准确)简单方法:

我指出的手册页面上有一个完整的例子; - )

答案 4 :(得分:9)

您正在混合对象和数组。您可以创建和访问对象,如下所示:

$obj = new stdClass;
$obj->foo = 'bar';

if($obj->foo == 'bar'){
// true
}

和这样的数组:

$obj = new Array();
$obj['foo'] = 'bar';

if($obj['foo'] == 'bar'){
// true
}

如果要将类作为数组和类访问,则可以定义类并添加实现ArrayAccess。

http://www.php.net/manual/en/language.oop5.php

答案 5 :(得分:7)

您可以以PHP数组的形式访问PHP对象,但方式不同。试试这个:

$obj->{'foo'}

这与访问数组类似:

$arr['foo']

你也可以这样做:

$propertyName = 'foo';
$obj->$propertyName; // same like first example

答案 6 :(得分:3)

您的对象必须实现ArrayAccess接口,然后PHP将允许您使用这样的方括号。

答案 7 :(得分:1)

您也可以将对象转换为数组:

if((array)$obj['foo'] == 'bar'){
  //more code here
}

答案 8 :(得分:1)

增强类功能,没有功能缺陷

您还可以使用ArrayAccess访问类中的单个数组属性,并以OOP方式访问其他属性。但它仍然会按照您的要求运作。

class Foo implements \ArrayAccess
{

/**
* mixed[] now you can access this array using your object 
* like a normal array Foo['something'] = 'blablabla'; echo  Foo['something']; ... and so on
* other properties will remain accessed as normal: $Foo->getName();
*/
private myArrayOptions = [];

private $name = 'lala';

    ...

    public function offsetExists($offset)
    {
        return isset($this->myArrayOptions[$offset]);
    }

    public function offsetGet($offset)
    {
        if ($this->offsetExists($offset)) {
            return $this->myArrayOptions[$offset];
        }

        return null; // or throw the exception;
    }

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

    public function offsetUnset($offset)
    {
        unset($this->myArrayOptions[$offset]);
    }

    public function getName()
    {
        return $this->name;
    }

    public function __set($offset, $value){
        $this->myArrayOptions[$offset] = $value;
    }

    ...

}

以上内容将按预期工作。

$obj->foo = 'bar';
if($obj['foo'] == 'bar'){
    echo "WoWo";
}

另请注意,Foo ['name'] !== Foo-> getName() 那两个不同的变量