PHP类构造函数设置属性值后无法正常获取的问题求助
问题分析与解决方案
嘿,这个问题我之前也碰到过!核心原因是构造函数的执行时机早于你给$start和$limit赋值的时机:当__construct运行时,$this->start和$this->limit都是默认的null,所以拼接出来的$string自然就是from: , size: 。哪怕之后在test()里给这两个属性赋值,$string也不会自动更新——因为它在构造阶段就已经被固定成字符串了,不会跟着属性变化动态刷新。
下面给你几种不同场景下的解决方案:
方案1:用动态访问器实时生成字符串(推荐)
如果$start和$limit可能在类的生命周期中多次变化,最好让$string每次被访问时都实时计算最新值。可以用自定义getter方法,或者PHP的魔术方法__get:
自定义Getter方法
class ApiController extends Controller { protected $start; protected $limit; protected $request; public function __construct(Request $request) { $this->request = $request; // 这里不再初始化$string,让它动态生成 } // 自定义方法获取拼接后的字符串 public function getString() { return 'from: '.$this->start. ', size: '.$this->limit; } public function test() { $this->start = 0; $this->limit = 10; echo $this->getString(); // 输出:from: 0, size: 10 } }
魔术方法__get(保持$this->string的访问方式)
如果你想继续用$this->string的方式访问,而不是调用方法,可以用魔术方法__get:
class ApiController extends Controller { protected $start; protected $limit; protected $request; public function __construct(Request $request) { $this->request = $request; } // 当访问受保护/未定义属性时触发 public function __get($name) { if ($name === 'string') { return 'from: '.$this->start. ', size: '.$this->limit; } // 其他属性的处理可以委托给父类 return parent::__get($name); } public function test() { $this->start = 0; $this->limit = 10; echo $this->string; // 输出:from: 0, size: 10 } }
方案2:赋值属性时同步更新$string
如果$start和$limit的赋值次数不多,可以给它们写setter方法,每次赋值时自动更新$string:
class ApiController extends Controller { protected $start; protected $limit; protected $string; protected $request; public function __construct(Request $request) { $this->request = $request; // 初始化时先更新一次字符串(可以给默认值) $this->updateString(); } // 私有方法统一处理字符串更新逻辑 private function updateString() { $this->string = 'from: '.$this->start. ', size: '.$this->limit; } public function setStart($value) { $this->start = $value; $this->updateString(); } public function setLimit($value) { $this->limit = $value; $this->updateString(); } public function test() { $this->setStart(0); $this->setLimit(10); echo $this->string; // 输出:from: 0, size: 10 } }
方案3:构造函数中直接从请求获取值(如果适用)
如果$start和$limit是从请求参数里来的(比如GET/POST参数),那直接在构造函数里获取它们的值,这样$string一开始就会是正确的:
class ApiController extends Controller { protected $start; protected $limit; protected $string; protected $request; public function __construct(Request $request) { $this->request = $request; // 从请求中获取参数,第二个参数是默认值 $this->start = $request->input('start', 0); $this->limit = $request->input('limit', 10); $this->string = 'from: '.$this->start. ', size: '.$this->limit; } public function test() { echo $this->string; // 直接输出正确结果 } }
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

