让PHP对象像数组一样工作?

让PHP对象像数组一样工作?,php,arrays,oop,Php,Arrays,Oop,我希望能够编写一个PHP类,其行为类似于数组,并使用普通数组语法获取和设置 例如(其中Foo是我制作的一个PHP类): 我知道PHP有_get和_set魔术方法,但这些方法不允许您使用数组符号来访问项。Python通过重载getitem和setitem来处理它 有没有办法在PHP中实现这一点?如果有区别的话,我正在运行PHP5.2。如果您扩展ArrayObject或实现ArrayAccess,那么您可以做您想做的事情 不,强制转换只会产生一个普通的PHP数组——失去ArrayObject派

我希望能够编写一个PHP类,其行为类似于数组,并使用普通数组语法获取和设置

例如(其中Foo是我制作的一个PHP类):

我知道PHP有_get和_set魔术方法,但这些方法不允许您使用数组符号来访问项。Python通过重载getitem和setitem来处理它


有没有办法在PHP中实现这一点?如果有区别的话,我正在运行PHP5.2。

如果您扩展
ArrayObject
或实现
ArrayAccess
,那么您可以做您想做的事情


不,强制转换只会产生一个普通的PHP数组——失去ArrayObject派生类拥有的所有功能。看看这个:

class CaseInsensitiveArray extends ArrayObject {
    public function __construct($input = array(), $flags = 0, $iterator_class =     'ArrayIterator') {
        if (isset($input) && is_array($input)) {
            $tmpargs = func_get_args();
            $tmpargs[0] = array_change_key_case($tmpargs[0], CASE_LOWER);
            return call_user_func_array(array('parent', __FUNCTION__), $tmp    args);
        }
        return call_user_func_array(array('parent', __FUNCTION__), func_get_args());
    }

    public function offsetExists($index) {
        if (is_string($index)) return parent::offsetExists(strtolower($index));
        return parent::offsetExists($index);
    }

    public function offsetGet($index) {
        if (is_string($index)) return parent::offsetGet(strtolower($index));
        return parent::offsetGet($index);
    }

    public function offsetSet($index, $value) {
        if (is_string($index)) return parent::offsetSet(strtolower($index, $value));
        return parent::offsetSet($index, $value);
    }

    public function offsetUnset($index) {
        if (is_string($index)) return parent::offsetUnset(strtolower($index));
        return parent::offsetUnset($index);
    }
}

$blah = new CaseInsensitiveArray(array(
    'A'=>'hello',
    'bcD'=>'goodbye',
    'efg'=>'Aloha',
));

echo "is array: ".is_array($blah)."\n";

print_r($blah);
print_r(array_keys($blah));

echo $blah['a']."\n";
echo $blah['BCD']."\n";
echo $blah['eFg']."\n";
echo $blah['A']."\n";
正如预期的那样,array_keys()调用失败。此外,is_数组($blah)返回false。但如果将构造函数行更改为:

$blah = (array)new CaseInsensitiveArray(array(
然后您只得到一个普通的PHP数组(is_array($blah)返回true,array_key($blah)工作),但是ArrayObject派生子类的所有功能都丢失了(在本例中,不区分大小写的键不再工作)。试着用两种方式运行上面的代码,你就会明白我的意思了


PHP应该要么提供一个键不区分大小写的本机数组,要么使ArrayObject可转换为array而不丢失子类实现的任何功能,要么使所有数组函数都接受ArrayObject实例。

非常酷。这两种方法似乎都不能与数组函数一起使用,如array_key_exists等。是否正确?正确,请改用offsetExist()方法。我会在实例化对象本身上这样做吗?如果($foo->offsetExists('fooKey')){}我相信您可以使用isset,但不能使用array\u key\u exists。将ArrayObject转换为数组以将其用于数组函数,例如array\u值((array)$some\u array\u object)。这是一个恼人的额外步骤,但它是有效的。
$blah = (array)new CaseInsensitiveArray(array(