PHP数组,始终通过引用
有没有一种方法可以创建一个PHP数组,它总是通过引用来处理,而不必使用PHP数组,始终通过引用,php,arrays,reference,Php,Arrays,Reference,有没有一种方法可以创建一个PHP数组,它总是通过引用来处理,而不必使用&操作符 例如: $a = array_by_ref('a', 'b', 'c'); $b = $a; $b[] = 'd'; 应导致$a和$b均等于: ('a', 'b', 'c', 'd') 如果SPL可用,则有以下类别: 这些仍然是包装器对象;要获得它们的基本数组等价物,必须使用对象的getArrayCopy()方法。还请记住,它可能非常慢,尤其是当您遍历它的元素时。ArrayObject与array\u map、a
&
操作符
例如:
$a = array_by_ref('a', 'b', 'c');
$b = $a;
$b[] = 'd';
应导致$a
和$b
均等于:
('a', 'b', 'c', 'd')
如果SPL可用,则有以下类别:
这些仍然是包装器对象;要获得它们的基本数组等价物,必须使用对象的
getArrayCopy()
方法。还请记住,它可能非常慢,尤其是当您遍历它的元素时。ArrayObject
与array\u map
、array\u reduce
以及期望使用真实数组作为输入的类似函数不匹配。如果要通过引用复制对象的数组属性,请使用任何类型的对象对其进行包装:
class Test
{
private $array;
public function __construct()
{
$this->array = (object) ['array' => []];
}
// we also need to return it by reference
public function &getMyArray()
{
return $this->array->array;
}
}
示例用法:
$test = new Test();
$test->getMyArray()[] = 'Hello';
$another = clone $test;
$another->getMyArray()[] = 'Fucking';
$third = clone $another;
$third->getMyArray()[] = 'World!';
unset($test->getMyArray()[1]);
var_dump($test->getMyArray() === $third->getMyArray());
var_dump(implode(" ", $test->getMyArray()));
var_dump(gettype($test->getMyArray()));
样本输出:
bool(true)
string(12) "Hello World!"
string(5) "array"
使用&symbol需要更少的键入:)就我个人而言,我建议不要做任何事情来回避&operator的使用,主要是为了代码的可读性。使用&可以清楚地表明您正在处理引用。删除它(使用任何方法)可能会给阅读您的代码的其他人造成混乱(甚至有时是您自己,因为从编写到重读都有很长的时间……当然,这在我身上从来没有发生过;))我认为
ArrayObject::getArrayCopy()
可能比强制转换更可取。@Mchl:谢谢您抓住了这一点。
bool(true)
string(12) "Hello World!"
string(5) "array"