国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP后期靜態(tài)綁定分析與應(yīng)用

red_bricks / 2477人閱讀

摘要:用于調(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é)論:
self::和parent::出現(xiàn)在某個類X的定義中,則將被解析為相應(yīng)的類X,除非在子類中覆蓋父類的方法。

3.Static(靜態(tài))關(guān)鍵字

作用:

- 在函數(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
Apple

b)使用forward_static_call()






運行結(jié)果:
Orange is
Orange is my favorite fruit
Apple is my father"s favorite fruit

c)使用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)文章

  • PHP中staticyield關(guān)鍵字的思考

    摘要:先來說說關(guān)鍵字。什么時候用來修飾方法關(guān)鍵字大家都知道是用來修飾方法與屬性的。一句話學(xué)會面向?qū)ο蟮姆绞絹硭伎肌3浞职l(fā)揮其性能優(yōu)勢,又能解決擴展性差的問題。這里不會進行與的比較。 你以為你知道了一切,只是你以為而已。知識的美妙就在于,一生的時光在它面前顯得多么的短暫。 嗯嗯,扯遠了,我今天只想說說:static 與 yield。 先來說說 static 關(guān)鍵字。本篇只講靜態(tài)方法的使用與后期...

    thursday 評論0 收藏0
  • 【Laravel】Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一)

    摘要:判斷是否存在構(gòu)造函數(shù),不存在直接實例化,存在則通過來獲取輸入函數(shù),并有相應(yīng)的方法解決依賴參數(shù)問題,實現(xiàn)依賴注入。 Laravel 框架關(guān)鍵技術(shù)解析·讀書筆記(一) 第一章 入口文件 請求訪問的入口文件,主要完成幾部分工作,分別是: 自動加載函數(shù)的添加 服務(wù)器實例化與服務(wù)注冊 路由加載 請求實例化與路由分發(fā) 相應(yīng)生成與發(fā)送 其中,自動加載函數(shù)用于包含引用文件,改文件是composer...

    CocoaChina 評論0 收藏0
  • php易錯筆記-類對象,命名空間

    摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關(guān)鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個實例 ...

    MartinHan 評論0 收藏0
  • Laravel 中的一個后期靜態(tài)綁定

    摘要:實驗一個抽象類,有個方法,通過延遲靜態(tài)綁定實例化并返回。這里如果把注釋打開,打印的就是重寫的值如果把抽象類改成普通類,改成的方式實例化,結(jié)果就不同了,打印的屬性都是各自類的屬性。 (原文地址,內(nèi)容以原文為準(zhǔn),可能修改或者補充:https://blog.tanteng.me/2017/...) 關(guān)于 PHP 的 new static 延遲靜態(tài)綁定,或者叫后期靜態(tài)綁定,在 Laravel...

    30e8336b8229 評論0 收藏0
  • PHP中的后期綁定

    摘要:先看一個例子輸出如果使用后期綁定后期靜態(tài)綁定從這里開始輸出使用或者對當(dāng)前類的靜態(tài)引用,取決于定義當(dāng)前方法所在的類,而不是調(diào)用者所在的類。后期綁定的意思是說,不再被解析為定義當(dāng)前方法所在的類,而是在實際運行時計算的。 先看一個例子: 輸出: A 如果使用后期綁定: 輸出: B 使用 self:: 或者 CLASS 對當(dāng)前類的靜態(tài)引用,取決于定義當(dāng)前方法所在的類,而不是調(diào)用者所在...

    dadong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<