摘要:用于調用父類中被覆蓋的屬性或方法出現在哪里,就將解析為相應類的父類。所以,可以用后期靜態綁定的辦法解決單例繼承問題。
基礎知識 1. 范圍解析操作符 (::)
可以用于訪問靜態成員,類常量,還可以用于覆蓋類中的屬性和方法。
self,parent 和 static 這三個特殊的關鍵字是用于在類定義的內部對其屬性或方法進行訪問的。
parent用于調用父類中被覆蓋的屬性或方法(出現在哪里,就將解析為相應類的父類)。
self用于調用本類中的方法或屬性(出現在哪里,就將解析為相應的類;注意與$this區別,$this指向當前實例化的對象)。
當一個子類覆蓋其父類中的方法時,PHP 不會調用父類中已被覆蓋的方法。是否調用父類的方法取決于子類。
2. PHP內核將類的繼承實現放在了"編譯階段"運行結果:
AA AA結論:
3.Static(靜態)關鍵字
self::和parent::出現在某個類X的定義中,則將被解析為相應的類X,除非在子類中覆蓋父類的方法。作用:
- 在函數體內的修飾變量的static關鍵字用于定義靜態局部變量。 - 用于修飾類成員函數和成員變量時用于聲明靜態成員。 - (PHP5.3之后)在作用域解析符(::)前又表示靜態延遲綁定的特殊類。例子:
定義靜態局部變量(出現位置:局部函數中)
特征:靜態變量僅在局部函數域中存在,但當程序執行離開此作用域時,其值并不丟失。
定義靜態方法,靜態屬性
a)聲明類屬性或方法為靜態,就可以不實例化類而直接訪問。
b)靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)
c)如果沒有指定訪問控制,屬性和方法默認為公有。
d)由于靜態方法不需要通過對象即可調用,所以偽變量 $this 在靜態方法中不可用。
e)靜態屬性不可以由對象通過 -> 操作符來訪問。
f)用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤。
g)就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態屬性初始化為整數或數組,但不能初始化為另一個變量或函數返回值,也不能指向一個對象。-------------------------------------------->a.靜態方法例子(出現位置: 類的方法定義)
-------------------------------------------->b.靜態屬性例子(出現位置:類的屬性定義)
staticValue() . " "; print $foo->my_static . " "; // Undefined "Property" my_static print $foo::$my_static . " "; $classname = "Foo"; print $classname::$my_static . " "; // As of PHP 5.3.0 print Bar::$my_static . " "; $bar = new Bar(); print $bar->fooStatic() . " "; ?>-------------------------------------------->c.用于后期靜態綁定(出現位置: 類的方法中,用于修飾變量或方法)
后期靜態綁定(late static binding)
下面詳細分析自 PHP 5.3.0 起,PHP 增加了一個叫做后期靜態綁定的功能,用于在繼承范圍內引用靜態調用的類。
1.轉發調用與非轉發調用轉發調用 :
指的是通過以下幾種方式進行的靜態調用:self::,parent::,static:: 以及 forward_static_call()。
非轉發調用 :
明確指定類名的靜態調用(例如Foo::foo())
非靜態調用(例如$foo->foo())
2.后期靜態綁定工作原理原理:存儲了在上一個“非轉發調用”(non-forwarding call)中的類名。意思是當我們調用一個轉發調用的靜態調用時,實際調用的類是上一個非轉發調用的類。
例子分析:
3.更多靜態后期靜態綁定的例子a)Self, Parent 和 Static的對比
selfname() . " "; echo $apple->parentname() . " "; echo $apple->staticname(); ?> 運行結果: Mango Orange Appleb)使用forward_static_call()
運行結果: Orange is Orange is my favorite fruit Apple is my father"s favorite fruitc)使用get_called_class()
運行結果: Mango Orange應用前面已經提到過了,引入后期靜態綁定的目的是:用于在繼承范圍內引用靜態調用的類。
所以, 可以用后期靜態綁定的辦法解決單例繼承問題。先看一下使用self是一個什么樣的情況:
通過上面的例子可以看到,使用self,實例化得到的都是類A的同一個對象
再來看看使用static會得到什么樣的結果
可以看到,使用static可以解決self時出現的單例繼承問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28440.html
摘要:先來說說關鍵字。什么時候用來修飾方法關鍵字大家都知道是用來修飾方法與屬性的。一句話學會面向對象的方式來思考。充分發揮其性能優勢,又能解決擴展性差的問題。這里不會進行與的比較。 你以為你知道了一切,只是你以為而已。知識的美妙就在于,一生的時光在它面前顯得多么的短暫。 嗯嗯,扯遠了,我今天只想說說:static 與 yield。 先來說說 static 關鍵字。本篇只講靜態方法的使用與后期...
摘要:判斷是否存在構造函數,不存在直接實例化,存在則通過來獲取輸入函數,并有相應的方法解決依賴參數問題,實現依賴注入。 Laravel 框架關鍵技術解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數的添加 服務器實例化與服務注冊 路由加載 請求實例化與路由分發 相應生成與發送 其中,自動加載函數用于包含引用文件,改文件是composer...
摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創建一個實例 ...
摘要:實驗一個抽象類,有個方法,通過延遲靜態綁定實例化并返回。這里如果把注釋打開,打印的就是重寫的值如果把抽象類改成普通類,改成的方式實例化,結果就不同了,打印的屬性都是各自類的屬性。 (原文地址,內容以原文為準,可能修改或者補充:https://blog.tanteng.me/2017/...) 關于 PHP 的 new static 延遲靜態綁定,或者叫后期靜態綁定,在 Laravel...
閱讀 3478·2023-04-26 02:00
閱讀 3078·2021-11-22 13:54
閱讀 1699·2021-08-03 14:03
閱讀 709·2019-08-30 15:52
閱讀 3085·2019-08-29 12:30
閱讀 2420·2019-08-26 13:35
閱讀 3364·2019-08-26 13:25
閱讀 3001·2019-08-26 11:39