3

在类上实现 _toString 方法时,可以将对象转换为字符串

$string =(string) $object

是否有在数组中转换的等价物

$array=(array) $object

根据我的测试,使用此代码,即使此对象实现 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 类具有我预期的行为

4

2 回答 2

2

不,没有将对象转换为数组的神奇功能。

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

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

于 2014-12-02T09:57:14.383 回答
1

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

/*
 * @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上述学术示例中的对象不能转换为有限数组。

于 2020-02-29T16:04:06.493 回答