php 转换在数组中实现 ArrayAccess 的对象


php Converting an object implementing ArrayAccess in array

当你在类上实现_toString方法时,你可以转换字符串中的对象

$string =(string) $object

是否有用于在数组中转换的等效项

$array=(array) $object

根据我的测试,使用此代码,objet 的属性在数组的索引中转换,即使此对象实现了 ArrayAccess。

我希望使用数组

访问权限强制转换一个对象,我将获得一个数组,该数组的值与我可以访问该对象相同的值

public class MyObject implements ArrayAccess{
     private $values;
     public function __construct(array $values){
        $this->values=$values;
     }
     public function offsetSet($name,$value){
        $this->values[$name]=$value;
     }
     //etc...
}
$myObject=new MyObject(array('foo'=>'bar');
$asArray=(array)$myObject;
print_r($asArray);
// expect array('foo'=>'bar')
// but get array('MyObjectvalues'=>array('foo'=>'bar'));

我还注意到本机 ArrayObject 类具有我预期的行为

不,没有魔术函数将对象转换为数组。

ArrayObject是用C实现的,并且具有奇怪的特定行为。

实现自定义方法asArray并使用它。

实际上,不可能写一个通用函数:

/*
 * @return array ArrayAccess object converted into an array
 */
function (ArrayAccess $arrayAccessObject): array { /* ... */ }

为什么?因为ArrayAccess接口只是提供了一种使用$aa[/*argument*/]语法的方法,但没有提供迭代所有可能的参数的方法。

我们曾经认为array的键数量有限。然而ArrayAccess让我们创建具有无限组键的对象(注意,同样的关注Traversable:即素数是"可遍历的"(。

例如,可以编写一个类,实现ArrayAccess,它的作用类似于带有缓存的HTTP客户端(我并不是说这是一个好主意;这只是一个例子(。然后offsetExists($url)告诉 URL 是否提供 200,offsetGet($url)返回 URL 的内容,offsetUnset($url)清除缓存的内容,offsetSet抛出一个LogicException,因为在这种情况下设置值毫无意义。

// ...
if (empty($client['https://example.com/file.csv'])) {
    throw new RuntimeException('Cannot download the file');
}
$content = $client['https://example.com/file.csv'];
// ...

或者也许有人想用ArrayAccess读取/写入/取消设置(删除(文件。

或者可能是这样的(偶数集是无限的(:

$even = new EvenNumberChecker(); // EvenNumberChecker implements ArrayAccess
$even[2]; // true
$even[3]; // false
$even[5.6]; // throws UnexpectedValueException
isset($even[7.8]); // false
$even[0] = $value; // throws LogicException

上面学术示例中的ArrayAccess对象不能转换为有限数组。

您可以使用

json_decodejson_encode来获取最通用的函数:

public static function toArray(ArrayAccess $array): array
{
    return json_decode(
        json_encode($array),
        true
    );
}