当你在类上实现_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_decode
和json_encode
来获取最通用的函数:
public static function toArray(ArrayAccess $array): array
{
return json_decode(
json_encode($array),
true
);
}