php中的繼承和延遲靜態繫結的問題

2021-06-29 13:31:45 字數 779 閱讀 1068

php的繼承模型中有乙個存在已久的問題,那就是在父類中引用擴充套件類的最終狀態比較困難。在php5.3之前會出現這種情況 1

<?

php2

3class

parentbase 

1213}14

15class

descendant 

extends

parentbase 

2021

echo

descendant

::render();22

在這個例子中,render()方法中使用了self關鍵字,這是指parentbase類而不是指descendant類。在parentbase::render()方法中沒法訪問$property的最終值。因為self關鍵字會在編譯時而不是執行時確定其作用域。為了解決這個問題,php5.3對這個問題做了補救,重新指定了static關鍵字的作用,需要在子類中重寫render()方法。

通過引入延遲靜態繫結功能,可以使用static作用域關鍵字訪問類的屬性或者方法的最終值,如**所示。

1<?

php2

3class

parentbase 

1213}14

15class

descendant 

extends

parentbase 

2021

echo

descendant

::render();22

通過使用靜態作用域,可以強制php在最終的類中查詢所有屬性的值。除了這個延遲繫結行為

PHP繼承 靜態延遲繫結

思考 self關鍵字適用於類內部代替類的,代替的是當前所在的類本身,隨著繼承的實現,如果子類子訪問父類的方法的時候,self到底代替的是誰呢?引入 self是一種靜態繫結,換言之即使當類進行編譯的時候seld已經明確繫結了類名,因此不論多少繼承,也不管是子類還是父類自己來進行訪問 self代表的都是...

php的延遲靜態繫結

先說下定義 就是把本類在定義階段固定下來的表示式或者變數,改在執行階段才決定。這個是為了解決下面 的問題才引入的 class parents class child extends parents echo child render parents可以看到我們使用self關鍵字只能夠訪問到該類中的靜...

php中「延遲靜態繫結」的使用

php的繼承模型中有乙個存在已久的問題,那就是在父類中引用擴充套件類的最終狀態比較困難。我們來看一下 清單5 11中的例子。清單5 11 意想不到的繼承 php2 3class parentbase 1213 14 15class descendant extends parentbase 2021...