You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:39:03