[请益] CentOS 和 Docker 7.2.5 版本差异 &__get

楼主: nidgetgod (NidgetGod)   2018-05-22 22:51:44
问题是这样的
我使用 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 吗?还是有哪里误会了
作者: JustGame (JustGame)   2018-05-23 00:26:00
php.ini error_reporting display_errors
作者: shvanta (vant)   2018-05-24 11:43:00
我大概可以猜到问题的原因。有C语言底子的话会比较快了解首先会产生这个error的时候,一定是你回传的东西是Array如果是Object的话就不会有这个问题那 Array 和 Object 差别在哪? 一个是Copy by Value,一个是 Copy by ReferenceArray 因为是 Copy by Value, 所以你假设回传的是 Array已经不是原来那个Array了,而是一个新的复本, 你对新的复本去做赋值(修改)的动作,并不会影响到原来的Arayy内容所以 PHP编译器给你一个 Notice (而不是error喔)提醒你(上面打错, 是 Pass By Value vs Pass By Reference)
作者: JustGame (JustGame)   2018-05-26 00:10:00
看一下所有 function 中 $this->xxx 的 xxx 是否已宣告

Links booklink

Contact Us: admin [ a t ] ucptt.com