我需要能够像这样设置我的对象:
$obj->foo = 'bar';
然后在设置之后我需要以下内容才能成为真实
if($obj['foo'] == 'bar'){
//more code here
}
答案 0 :(得分:17)
只需将implements ArrayAccess
添加到您的班级并添加所需的方法:
答案 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个准确)简单方法:
ArrayAccess::offsetExists
:是否存在偏移量。 ArrayAccess::offsetGet
:返回指定偏移量的值。ArrayAccess::offsetSet
:为指定的偏移量指定一个值。 ArrayAccess::offsetUnset
:取消设置偏移量。 我指出的手册页面上有一个完整的例子; - )
答案 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。
答案 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() 那两个不同的变量