<?php
$data = $likeArray->getArrayCopy();
?>
如果将它转换为数组,则不会神奇地调用它。虽然我期望它。
<?php
$nothing = (array)$likeArray;
?>
这里,$data != $nothing。
(PHP 5, PHP 7, PHP 8)
ArrayObject::getArrayCopy — 创建 ArrayObject 的副本
此函数没有参数。
返回数组的副本。当 ArrayObject 引用一个对象时,将返回该对象属性的数组。
示例 #1 ArrayObject::getArrayCopy() 示例
<?php
// 可用水果数组
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);
$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;
// 创建数组副本
$copy = $fruitsArrayObject->getArrayCopy();
print_r($copy);
?>
上面的例子将输出
Array ( [lemons] => 1 [oranges] => 4 [bananas] => 5 [apples] => 10 [pears] => 4 )
<?php
$data = $likeArray->getArrayCopy();
?>
如果将它转换为数组,则不会神奇地调用它。虽然我期望它。
<?php
$nothing = (array)$likeArray;
?>
这里,$data != $nothing。
如果你做了这样的事情来使你的构造函数支持多维,你将很难使用 getArrayCopy 从方法中直接获取一个普通数组
<?php
public function __construct( $array = array(), $flags = 2 )
{
// 让对象具有正确的名称,而不是继承的名称
$class = get_class($this);
foreach($array as $offset => $value)
$this->offsetSet($offset, is_array($value) ? new $class($value) : $value);
$this->setFlags($flags);
}
?>
这就是我解决它的方法
<?php
public function getArray($recursion = false)
{
// 以防对象可能是多维的
if ( $this === true)
return $this->getArrayCopy();
return array_map( function($item){
return is_object($item) ? $item->getArray(true) : $item;
}, $this->getArrayCopy() );
}
?>
希望这对你有所帮助!
将它转换为数组和使用此函数有什么区别?
例如,如果我们有
$arrayObject = new ArrayObject([1, 2, 3]);
这些之间有什么区别
$array = (array) $arrayObject;
vs
$array = $arrayObject->getArrayCopy();
如果不是,那么在哪些情况下它们会产生不同的结果,或者它们以不同的方式产生结果?
"当 ArrayObject 引用一个对象时,将返回该对象公共属性的数组。"
这个描述似乎不对
<?php
class A
{
public $var = 'var';
protected $foo = 'foo';
private $bar = 'bar';
}
$o = new ArrayObject(new A());
var_dump($o->getArrayCopy());
/*
转储:
array(3) {
["var"]=>
string(3) "var"
["*foo"]=>
string(3) "foo"
["Abar"]=>
string(3) "bar"
}
*/
?>
所以它不仅包含公共属性。