如何根据以下示例正确完成PHP中的父级功能? 在每次addArray调用时,我可以确保我的数组没有被覆盖并且数组中的先前值会丢失吗?
function arraybase() {
$this->array = new ArrayObject();
return $this;
}
function addArray($value) {
parent::$this->arraybase();
$this->array->append($value);
return $this;
}
$this->addArray('1')->addArray('2')->addArray('3');
// outputs:
Array
(
[0] => 3
)
答案 0 :(得分:2)
在function addArray
中,您将继续使用以下行重新创建数组:
parent::$this->arraybase();
删除此行并在想要创建时调用arraybase。
答案 1 :(得分:1)
嗯,首先,您不需要parent::$this->arraybase()
。只做$this->arraybase()
。事实上,我甚至不确定你的方式是否是有效的语法。但我离题了。
至于您的具体问题,您可以:
添加构造函数(并从->arraybase()
移除addArray()
调用):
public function __construct() {
$this->array = new ArrayObject();
}
在->arraybase()
:
public function addArray($value) {
if (!isset($this->array) || !is_object($this->array)) {
$this->arraybase();
}
...
}
就个人而言,我会做#1。它将更可靠,更快速,并且更符合OOP范例。
编辑:添加构造函数
所以,如果你的基类有这个构造函数:
public function __construct($some, $vars) {
......
}
您可以在扩展课程中执行此操作:
public function __construct($some, $vars) {
parent::__construct($some, $vars);
$this->array = new ArrayObject();
}
注意:除非其中一位父母有__construct方法,否则不要致电parent::__construct()
...
答案 2 :(得分:0)
为什么要在ArrayObject周围设置包装器?如果它是为了增加链接方法调用的可能性,那么你最好扩展ArrayObject:
<?php
class MyArrayObject extends ArrayObject {
public function append($value)
{
parent::append($value);
return $this;
}
}
$ao = new MyArrayObject();
$ao->append('a')->append('b')->append('c');
var_dump($ao->getArrayCopy());
/*
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
*/