作者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/m.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