[請益] CentOS 和 Docker 7.2.5 版本差異 &__get

看板PHP作者 (NidgetGod)時間6年前 (2018/05/22 22:51), 6年前編輯推噓0(0015)
留言15則, 2人參與, 6年前最新討論串1/1
問題是這樣的 我使用 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

05/23 00:26, 6年前 , 1F
php.ini error_reporting display_errors
05/23 00:26, 1F
※ 編輯: nidgetgod (220.133.99.231), 05/23/2018 23:11:10

05/24 00:24, 6年前 , 2F
所以設成一樣,CentOS apache 重開就知道結果了不是嗎?
05/24 00:24, 2F

05/24 11:43, 6年前 , 3F
我大概可以猜到問題的原因。有C語言底子的話會比較快了解
05/24 11:43, 3F

05/24 11:44, 6年前 , 4F
首先會產生這個error的時候,一定是你回傳的東西是Array
05/24 11:44, 4F

05/24 11:44, 6年前 , 5F
如果是Object的話就不會有這個問題
05/24 11:44, 5F

05/24 11:45, 6年前 , 6F
那 Array 和 Object 差別在哪? 一個是Copy by Value,
05/24 11:45, 6F

05/24 11:45, 6年前 , 7F
一個是 Copy by Reference
05/24 11:45, 7F

05/24 11:46, 6年前 , 8F
Array 因為是 Copy by Value, 所以你假設回傳的是 Array
05/24 11:46, 8F

05/24 11:46, 6年前 , 9F
已經不是原來那個Array了,而是一個新的複本, 你對新的複
05/24 11:46, 9F

05/24 11:47, 6年前 , 10F
本去做賦值(修改)的動作,並不會影響到原來的Arayy內容
05/24 11:47, 10F

05/24 11:48, 6年前 , 11F
所以 PHP編譯器給你一個 Notice (而不是error喔)提醒你
05/24 11:48, 11F

05/24 11:51, 6年前 , 12F
(上面打錯, 是 Pass By Value vs Pass By Reference)
05/24 11:51, 12F
※ 編輯: nidgetgod (220.133.115.251), 05/24/2018 16:52:03

05/24 22:15, 6年前 , 13F
應該是你已經改成 &__get 了, 所以回傳的行為已經改變
05/24 22:15, 13F

05/24 22:17, 6年前 , 14F
本來是回傳value(array複本),現在是回傳reference(本尊)
05/24 22:17, 14F

05/26 00:10, 6年前 , 15F
看一下所有 function 中 $this->xxx 的 xxx 是否已宣告
05/26 00:10, 15F
文章代碼(AID): #1R12w38V (PHP)