PHP中如何用箭头操作符实现对象属性的动态赋值?
问题根源与解决方案
问题出在类属性的访问权限上,而不是你用的箭头语法!
你的Jobs类里的$orderid、$quantity等属性都是private修饰的,PHP的封装机制明确禁止在类的外部直接修改私有属性——不管你用$jobObject->$keys[$i]还是$jobObject->{$keys[$i]},本质都是在类外直接操作私有属性,所以必然触发权限报错。
下面给你几种不同场景下的解决方案:
方案1:快速实现——将属性改为public
如果不需要严格的封装性,这是最简单的解决方式:
// 修改后的Jobs类 class Jobs { public $orderid; public $quantity; public $contactno; public $contactname; }
修改后,你原来的循环赋值代码(包括加了大括号的$jobObject->{$keys[$i]} = $row[$i];)就能正常工作了。
方案2:兼顾封装——添加__set魔术方法
如果要保留属性的私有性,同时允许外部赋值,可以在Jobs类中添加PHP的魔术方法__set,当外部尝试给私有属性赋值时会自动触发这个方法:
class Jobs { private $orderid; private $quantity; private $contactno; private $contactname; // 魔术方法:处理外部对私有属性的赋值请求 public function __set($name, $value) { // 先校验属性是否存在,避免非法赋值 if (property_exists($this, $name)) { $this->$name = $value; } else { // 可选:抛出异常提示非法属性 throw new Exception("Property $name does not exist in Jobs class"); } } }
这种方式下,你原来的循环赋值代码不需要做任何修改,就能正常给私有属性赋值。
方案3:规范设计——封装批量赋值方法
这是最符合面向对象设计原则的方案,通过专门的方法来处理属性赋值,完全控制权限和逻辑:
class Jobs { private $orderid; private $quantity; private $contactno; private $contactname; // 批量赋值方法 public function setProperties(array $data) { // 定义允许赋值的属性列表,防止非法属性注入 $allowedProperties = ['orderid', 'quantity', 'contactno', 'contactname']; foreach ($data as $key => $value) { if (in_array($key, $allowedProperties) && property_exists($this, $key)) { $this->$key = $value; } } } // 可选:添加__get方法方便外部读取私有属性 public function __get($name) { if (property_exists($this, $name)) { return $this->$name; } throw new Exception("Property $name does not exist in Jobs class"); } }
使用时只需要把数据整理成关联数组,调用方法即可:
$jobObject = new Jobs(); $row = array('894949','45','08097577580','Emi'); // 把索引数组转为关联数组 $propertyData = array_combine($keys, $row); $jobObject->setProperties($propertyData);
内容的提问来源于stack exchange,提问作者amachree tamunoemi
相关产品推荐
相关产品推荐

