看板 PHP 關於我們 聯絡資訊
問題是這樣的 我使用 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://www.ptt.cc/bbs/PHP/M.1527000707.A.21F.html
JustGame: php.ini error_reporting display_errors 05/23 00:26
※ 編輯: nidgetgod (220.133.99.231), 05/23/2018 23:11:10
JustGame: 所以設成一樣,CentOS apache 重開就知道結果了不是嗎? 05/24 00:24
shvanta: 我大概可以猜到問題的原因。有C語言底子的話會比較快了解 05/24 11:43
shvanta: 首先會產生這個error的時候,一定是你回傳的東西是Array 05/24 11:44
shvanta: 如果是Object的話就不會有這個問題 05/24 11:44
shvanta: 那 Array 和 Object 差別在哪? 一個是Copy by Value, 05/24 11:45
shvanta: 一個是 Copy by Reference 05/24 11:45
shvanta: Array 因為是 Copy by Value, 所以你假設回傳的是 Array 05/24 11:46
shvanta: 已經不是原來那個Array了,而是一個新的複本, 你對新的複 05/24 11:46
shvanta: 本去做賦值(修改)的動作,並不會影響到原來的Arayy內容 05/24 11:47
shvanta: 所以 PHP編譯器給你一個 Notice (而不是error喔)提醒你 05/24 11:48
shvanta: (上面打錯, 是 Pass By Value vs Pass By Reference) 05/24 11:51
※ 編輯: nidgetgod (220.133.115.251), 05/24/2018 16:52:03
shvanta: 應該是你已經改成 &__get 了, 所以回傳的行為已經改變 05/24 22:15
shvanta: 本來是回傳value(array複本),現在是回傳reference(本尊) 05/24 22:17
JustGame: 看一下所有 function 中 $this->xxx 的 xxx 是否已宣告 05/26 00:10