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