PHP父子类共同操作数组时父类构造器重置数组问题如何解决
问题根源
你遇到的现象本质是不同对象实例的属性互相独立:你先实例化了DevController得到$dev对象,调用index方法给$dev自己的ssmlArray加了"Hello ";之后在index里新实例化了ChildClass得到$devclass,这个新对象会自动执行父类构造方法,初始化属于$devclass自己的空ssmlArray,和$dev的数组没有任何关系,所以最终输出只有"world"。
实现方案
这个需求完全可以实现,以下是两种常用的实现方式:
方案1:将ssmlArray设为类静态属性(实现最简单)
静态属性属于类本身,所有该类/子类的实例共享同一份数据,不会因为新实例化就重置:
$dev = new DevController; $dev->index(); class DevController{ // 改为静态属性,类全局共享 public static $ssmlArray = array(); public function __construct(){ // 构造方法里不再初始化静态属性,避免重置 } public function index(){ $this->addToOutput("Hello ", false); $devclass = new ChildClass; $devclass->world(); } public function addToOutput($ssml, $sendToOutput){ // 操作静态属性要加self:: array_push(self::$ssmlArray, $ssml); if($sendToOutput == true){ $output = ""; foreach(self::$ssmlArray as $singlerow){ $output .= $singlerow; } print_r(json_encode($output)); exit; } } } class ChildClass extends DevController{ public function world(){ $this->addToOutput("world", true); } }
运行后会输出"Hello world",符合预期要求。
方案2:不新增子类实例,直接复用当前实例
如果不需要单独实例化子类,你也可以直接所有操作都在同一个实例上完成,避免出现两个独立实例导致数据隔离:
// 直接实例化子类,所有操作都在同一个实例上完成 $dev = new ChildClass; $dev->index(); class DevController{ public $ssmlArray = array(); public function __construct(){ $this->ssmlArray = array(); } public function index(){ $this->addToOutput("Hello ", false); // 直接调用当前实例的world方法,不需要新实例化 $this->world(); } public function addToOutput($ssml, $sendToOutput){ array_push($this->ssmlArray, $ssml); if($sendToOutput == true){ $output = ""; foreach($this->ssmlArray as $singlerow){ $output .= $singlerow; } print_r(json_encode($output)); exit; } } // 父类预留world方法空实现即可 public function world(){} } class ChildClass extends DevController{ public function world(){ $this->addToOutput("world", true); } }
内容的提问来源于stack exchange,提问作者KSIV
相关产品推荐
相关产品推荐

