[請益] 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