PHP类set方法赋值属性后所有get返回最后设置值的问题咨询
异常产生原因
核心错误是PHP类属性访问语法书写错误:你在所有setter、getter方法中使用了$this->$_views、$this->$_urls、$this->$_traffic的写法,属性名前多写了一个$符号,这属于PHP的可变属性语法,并非访问指定类属性的标准写法。
- 调用
setViewCount(44)时,类属性$_views初始值为null,PHP会将null转为空字符串作为实际属性名,实际执行的是给$this->""赋值44 - 调用
setUrlCount(55)时,类属性$_urls初始值同样为null,继续给$this->""赋值55,覆盖之前存入的44 - 调用
setTraffic(99999)时,类属性$_traffic初始值还是null,再次给$this->""赋值99999,覆盖之前存入的55 - 所有getter方法取值时,同样因为属性名对应的变量值为null,读取的都是
$this->""中存储的最后一次赋值99999,最终输出的三个字段值完全一致。
修复方案
将类中所有属性访问语句里,属性名前多余的$符号删除即可,修正后的Log类代码如下:
<?php namespace Task; class Log { private $_views = null; private $_urls = null; private $_traffic = null; /** * @param int $count */ public function setViewCount(int $count) { $this->_views = $count; } /** * @return int */ public function getViewCount() { return $this->_views; } /** * @param int $count */ public function setUrlCount(int $count) { $this->_urls = $count; } /** * @return int */ public function getUrlCount() { return $this->_urls; } /** * @param int $trafficData */ public function setTraffic(int $trafficData) { $this->_traffic = $trafficData; } /** * @return int */ public function getTraffic() { return $this->_traffic; } } ?>
修改后重新执行测试代码,将得到预期输出:{"views":44,"urls":55,"traffic":99999}。
语法提示:PHP中访问类实例的固定属性时,
$this->后直接写属性名即可,不需要给属性名加$前缀;只有当你需要用某个变量的值动态指定要访问的属性名时,才会使用$this->$变量名的可变属性写法。
内容的提问来源于stack exchange,提问作者WideWood
相关产品推荐
相关产品推荐

