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