能否在PHP类的另一个公共函数中更新公共函数内定义的对象?
问题解答:PHP类中跨函数更新对象的实现
首先明确:完全可行,但你的代码存在几个关键错误,导致出现Attempt to modify property "obj1" on null的报错,下面一步步分析并修正:
错误原因分析
- 局部变量与类属性混淆:你在
setObj()里定义的$obj1和$obj2是函数局部变量,仅在setObj()执行期间存在,函数结束后即销毁,其他函数(比如objUpdate())无法访问这些变量。 setObj()无返回值:setObj()未编写return语句,默认返回null,因此$this->setObj()->obj1等价于null->obj1,必然触发“在null上修改属性”的错误。- 未定义类属性:你试图用
$this->obj1访问类属性,但该属性从未在类中声明过。
修正后的代码方案
我们需要将obj1和obj2定义为类的公共属性,让同一个类的所有方法都能访问和修改它们。以下是两种常见实现方式:
方案1:声明类属性,用setObj()初始化
class test { // 声明类的公共属性,供所有方法访问 public $obj1; public $obj2; public function setObj() { // 初始化类属性,而非局部变量 $this->obj1 = (object)[]; $this->obj2 = (object)[]; // 返回$this支持链式调用(可选,匹配你原写法习惯) return $this; } public function objUpdate() { // 先调用setObj()初始化属性 $this->setObj(); // 通过$this直接访问类属性并修改 $this->obj1->item1 = 'value1'; $this->obj1->item2 = 'value2'; $this->obj2->item3 = 'value3'; $this->obj2->item4 = "value4"; // 合并两个类属性对象 $obj_merged = (object) array_merge((array)$this->obj1, (array)$this->obj2); return $obj_merged; } } $testobj = new test(); var_dump($testobj->objUpdate());
方案2:用构造函数初始化属性(更简洁)
如果obj1和obj2是类实例化时就需要的对象,可直接在构造函数中初始化,省去单独的setObj()方法:
class test { public $obj1; public $obj2; // 构造函数:实例化类时自动执行 public function __construct() { $this->obj1 = (object)[]; $this->obj2 = (object)[]; } public function objUpdate() { $this->obj1->item1 = 'value1'; $this->obj1->item2 = 'value2'; $this->obj2->item3 = 'value3'; $this->obj2->item4 = "value4"; $obj_merged = (object) array_merge((array)$this->obj1, (array)$this->obj2); return $obj_merged; } } $testobj = new test(); var_dump($testobj->objUpdate());
关键知识点总结
- 类属性:在类的方法外部声明的变量(如
public $obj1;)属于类的实例,同一实例的所有方法都能通过$this->属性名访问和修改。 - 局部变量:在方法内部声明的变量(如你原代码中的
$obj1 = (object)[];)仅在当前方法内有效,方法执行完毕后会被销毁。 - 链式调用:若想在调用方法后继续访问属性,方法需返回
$this(当前类实例)。
内容的提问来源于stack exchange,提问作者marlon1215
相关产品推荐
相关产品推荐

