本篇有毒,請小心服用
本篇有毒,請小心服用
本篇有毒,請小心服用
推薦看這篇Self, this, static 在 PHP 中的差異 - Learn or Die、Ray Lee | 李宗叡 – Medium內容,大神整理的文章就是不一樣,當出只是想了解 static ,結果查到相關東西有點多,就動手實作就順便記錄,因為我程式能力也不是特別強,英文也不是特別好,所以這篇文章都是測試看結果推測結論,這可能不是最正確的方法,所以不推薦路過的人看這篇。
當出只是想留給自己當記錄用,就想應該沒有人會看到這篇,前陣子看到FB大神貼的文章,想說之前有寫過,看到下面有引用我的文章,嚇死哥了!!丟臉死啦
本篇應該不會再修正,因為我最近工作是使用 Java,所以不會再跳回已前的坑。其實我還是沒有把握寫好這篇!!XD我原本想寫 Blog 是當做自己筆記,想說常常也從別的 Blog 學到一些東西,也當然想分享到網路上,希望路過的人能看到我的文章解決問題我也會滿高興的。
網路很容易分享資訊,但分享出去資訊是不是正確也要自己驗證,有錯誤也歡迎指教,也可以跟我說哪裡有錯。
===========
最近使用在看static
部份
平常很少用,過很久可能就會忘了這是什麼東西
但 global 部份應該不再記錄
PHP 有關參照(Reference)的那些事 | 程式狂想筆記
這裡面有簡單提到
static 用在變數
static 通常是寫在 function 裡面
但寫在 function 外面也不會報錯
一般沒有 static
1 |
|
static 後
1 |
|
遞迴 function static 變數
先看官網範例,可以用在遞迴,但後面注意$count--
的關係
所以跑完$count
變數會歸 0
但是沒有寫$count--
不會
1 |
|
定義 static 變數限制
簡單看官往範例,其實也滿好懂得
用運算式再次進入 function 怎麼知道初始值
1 |
|
靜態聲明是在編譯時解析的。
深入理解 PHP 代码的执行的过程 - risingsun001 的专栏 - CSDN 博客
這一快我不是很了解
static 用在 Object Function
self
這邊先介紹 Object 會用到的 self
self:: 或者 __CLASS__,也可以用 get_class()呼叫
簡單說明一下,這邊跟 Java 的 this 很像
當是參照當前放置的 class 位置
可以看一下java method 類別成員(class member) 繼承踩雷 | 程式狂想筆記
1 |
|
static
Late Static Bindings(后期静态绑定)
static 跟 get_called_class()方法一樣,他是指實例後物件位置
1 |
|
在非靜態環境下,所調用的類即為該對象實例所屬的類。由於 \$this-> 會在同一作用範圍內嘗試調用私有方法,而 static:: 則可能給出不同結果。另一個區別是 static:: 只能用於靜態屬性。
在非靜態環境下使用 static::
Note:
在非靜態環境下,所調用的類即為該對象實例所屬的類。由於 \$this-> 會在同一作用範圍內嘗試調用私有方法,而 static:: 則可能給出不同結果。另一個區別是 static:: 只能用於靜態屬性。
事後我在網路上找到了,更詳細解說
PHP 中 self、static、\$this 的区别 & 后期静态绑定详解 - 彳亍 - CSDN 博客
備份圖
老實說這篇寫很亂了 orz
1 | 注意事项 |
1 |
|
Late static bindings’ resolution will stop at a fully resolved static call with no fallback. On the other hand, static calls using keywords like parent:: or self:: will forward the calling information.
1 |
|
1 |
|
老實說上面例子花我很多時間想的,重寫兩次文章(因為一直發現理解錯誤)
只要進入 B 的 parent,static,self 再跳到 A 的 test function 裡面的static::who();
(後期靜態綁定)
就會抓當下 class
不管是實例
或者 static
都會印出 C
下面是直接在 B 的 test()做,第一次的時候做轉發,跳到下一個 function *_沒有用後期靜態綁定
而且\_CLASS__(self),只會抓到原本的類別(非實例出來的類別)
這邊的 static 轉發(forward)同等於forward_static_call()
所以下面這個範例,__CLASS__改成get_called_class()
一樣會變成上面結果一致
forward_static_call 和 call_user_func
這兩個 function 功能很像,但差在用在 static 地方。
重點是下面這兩個call_user_func('A::bar'); //non-forwarding, 'A'
和forward_static_call('A::bar'); //forwarding, 'B'
這兩個讓我想到 JavaScript 閉包用到(this)這個東西,但 js 解決方法是用箭頭函式
和var that = this
解決(題外話,請忽略這段)
但 forward_static_call 有一個例外,當父類別到子類別的話,不做轉發動做,看下面範例
php 5.3 - PHP forward_static_call vs call_user_func - Stack Overflow
1 | The difference is just that forward_static_call does not reset the "called class" information if going up the class hierarchy and explicitly naming a class, whereas call_user_func resets the information in those circumstances (but still does not reset it if using parent, static or self). |
The difference is just that forward_static_call does not reset the “called class” information if going up the class hierarchy and explicitly naming a class, whereas call_user_func resets the information in those circumstances (but still does not reset it if using parent, static or self).
最後我覺得 static 和\$this 很相似
但看到這篇裡面有寫差異
雖然我有一點 Java 物件導向觀念,但是 PHP 物件導向還滿難理解
1 | static 和 $this 有点类似,但又有区别: |
參考來源
- PHP 的 static 與 self 兩個關鍵字的差異 | Asika Lab 飛鳥實驗室
- PHP: Late Static Bindings - Manual
- PHP: forward_static_call - Manual
- PHP forward_static_call vs call_user_func | landcareweb.com
- PHP 5.3/6 新增功能 - Late Static Bindings - 石頭閒語
- php 5.3 - PHP forward_static_call vs call_user_func - Stack Overflow
- PHP forward_static_call 和 call_user_func - 代码日志
- PHP: forward_static_call - Manual
- PHP 关于 self:: 和 static:: | 随意博客
- 通过 static 关键词来实现 late static binding(静态调用绑定)-pilishen.com,做全球最好的实战教程
- [PHP 觀念]self 和\$this 的差異 @ 麥克的學習紀錄 :: 痞客邦 ::