作者nidgetgod (NidgetGod)
看板PHP
标题[请益] CentOS 和 Docker 7.2.5 版本差异 &__get
时间Tue May 22 22:51:44 2018
问题是这样的
我使用 Docker php:apache 7.2.5 在本机上开发,没有问题
但在 CentOS 7 上安装 PHP 7.2.5 却出现了
Indirect modification of overloaded property 错误
这个错误在 Stack Overflow 上有解法
https://reurl.cc/lKXq
就是在 magic method __get 前加上 & 变成 &__get 解决
但仍然不解的是到底哪里造成的差异,让 CentOS 上会出错 Docker 却不会
事实上也有人回应,在 codepad 上也不会看到错误
求解,感谢
@JustGame
CentOS 的 php.ini
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
Docker 的 php.ini
error_reporting 无值(no value)
display_errors = Off
感谢,一语惊醒梦中人
我去查了 PHP 官方文件,当 error_reporting 无值的时候预设值是
E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
所以把 CentOS 的 PHP 改成 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
结果就一致了,但忽略 Notice 好像不是个好习惯,我会再想办法解决
@shvanta
回传的确是包着 Object 的 Array 没错,我的确也是期望它能修改原本的 Object 内容
理论上它应该只改到复本不应影响本体(正确的名词应该是什麽...)
但实际上,它虽然有跳 Notice 但还是改了本体的内容了!!!
这算是 bug 吗?还是有哪里误会了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.133.99.231
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1527000707.A.21F.html
1F:→ JustGame: php.ini error_reporting display_errors 05/23 00:26
※ 编辑: nidgetgod (220.133.99.231), 05/23/2018 23:11:10
2F:→ JustGame: 所以设成一样,CentOS apache 重开就知道结果了不是吗? 05/24 00:24
3F:→ shvanta: 我大概可以猜到问题的原因。有C语言底子的话会比较快了解 05/24 11:43
4F:→ shvanta: 首先会产生这个error的时候,一定是你回传的东西是Array 05/24 11:44
5F:→ shvanta: 如果是Object的话就不会有这个问题 05/24 11:44
6F:→ shvanta: 那 Array 和 Object 差别在哪? 一个是Copy by Value, 05/24 11:45
7F:→ shvanta: 一个是 Copy by Reference 05/24 11:45
8F:→ shvanta: Array 因为是 Copy by Value, 所以你假设回传的是 Array 05/24 11:46
9F:→ shvanta: 已经不是原来那个Array了,而是一个新的复本, 你对新的复 05/24 11:46
10F:→ shvanta: 本去做赋值(修改)的动作,并不会影响到原来的Arayy内容 05/24 11:47
11F:→ shvanta: 所以 PHP编译器给你一个 Notice (而不是error喔)提醒你 05/24 11:48
12F:→ shvanta: (上面打错, 是 Pass By Value vs Pass By Reference) 05/24 11:51
※ 编辑: nidgetgod (220.133.115.251), 05/24/2018 16:52:03
13F:→ shvanta: 应该是你已经改成 &__get 了, 所以回传的行为已经改变 05/24 22:15
14F:→ shvanta: 本来是回传value(array复本),现在是回传reference(本尊) 05/24 22:17
15F:→ JustGame: 看一下所有 function 中 $this->xxx 的 xxx 是否已宣告 05/26 00:10