【问题标题】:php Converting an object implementing ArrayAccess in arrayphp 在数组中转换实现 ArrayAccess 的对象
【发布时间】:2015-01-30 12:02:14
【问题描述】:

当你在一个类上实现 _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 类具有我预期的行为

【问题讨论】:

  • 要么从ArrayObject派生,要么重用getArrayCopy;或者通过返回 $values 属性来重新实现它。投射不起作用,因为没有 __toArray 处理。
  • public function MyObject implements ArrayAccess{ class MyObject implements ArrayAccess { ...。

标签: php casting type-conversion arrayaccess


【解决方案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 对象无法转换为有限数组。

【讨论】:

    【解决方案2】:

    不,没有magic function 将对象转换为数组。

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

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

    【讨论】:

    • 一个模糊的回应,没有提供任何解决方案。
    猜你喜欢
    • 2014-03-16
    • 2012-04-15
    • 2022-01-14
    • 2013-02-01
    • 2011-02-19
    • 1970-01-01
    • 2011-07-14
    • 2016-05-15
    • 2017-06-26
    相关资源
    最近更新 更多