php利用反射真正實現多繼承(非介面模擬)

2021-06-19 21:57:55 字數 2238 閱讀 7908

昨天我在寫php程式的時候,無意發現在php的::操作符非常強大,不僅僅是只用在訪問parent,sel,靜態成員屬性、常量上面,其實他的功能強大了去了。

這個符號在php中實際上叫做範圍解析符,這是php官方的解釋php.net/manual/zh/language.oop5.paamayim-nekudotayim.php。但是官方中文部分只是簡單的介紹了

訪問parent,sel,靜態成員屬性、常量的作用,而下面英文部分,可能由於咱們這些吊死對英文不好的緣故,就沒看下去了,實現上,下面還有乙個強大的特性,我們大家都沒看到。

什麼叫範圍操作符呢,可能很多人都沒有認真的去分析過,這幾個字,根據我這兩年的程式設計的理解,我覺得應該是定義了類中的成員屬性和成員方法的所在範圍,感覺有點類似命名空間的感覺。

而self::method();其實指的就是呼叫當前範圍裡的method方法,那parent自然指的就是父類所在範圍,這就是為什麼,我們在子類中覆蓋父類的方法,我們仍然可以用parent::method()訪問的原因。大家還要注意一點,self永遠指向的是其實宣告位置所在類本身和而parent永遠指向的是宣告位置所在類的父類,不會受繼承上下文的影響而改變。

前面講的這些可能大家有些人已經知道了,上面說過::在php中叫範圍解析操作符,上面我說過了既然,parent和self都能指向乙個類範圍的代名詞,那試想下,我們能不能用類名指向某個範圍呢,答案當然是可以的。我們可以這樣

<?php

class a

}a::demo();

不知道大家發現沒,裡面的demo方法並不靜態方法,但我卻可以這樣訪問,那是因為a::指向的class範圍,所以可以訪問時面的demo方法,php官方有這樣的示例**,就在上面我發的鏈結中,大家可以仔細看下。

大家肯定又疑惑這跟多繼承有什麼關係呢,別急,心急吃不了熱豆腐的!!!!!

其實這個範圍操作符還有乙個很大的特性,就是當在類外部呼叫乙個非靜態公共方法時,方法內部的$this指標會指向他當前執行所在物件本身(宿主物件),當乙個類例項化時,方法裡面$this永遠指向的例項化後的物件本身,為什麼呢,因為這個方法是被這個物件呼叫執行的,所以這個物件就是他的宿主物件。而剛才我們直接在全域性調中呼叫這個方法時,由於這個方法執行時不在任何物件中,所以不存在任何宿主物件,所以如果在方法裡面寫$this的話會報致命錯誤。那怎麼樣才能擁有宿主物件,然後直接呼叫。仔細看我剛才講的同學可能注意到,我剛才說過"因為這個方法是被這個物件呼叫執行的,所以這個物件就是他的宿主物件"。所以理論上說,我們只要改變執行這個方法的所在環境,就可以改變他的宿主物件。下面我們來實驗下

<?php

class a

}class b

}$o = new b;

$o->run();

大家猜會輸出什麼。。。。。。。

大家可以動手做一下試驗。。。。。

由於a::say_name()是被物件$o呼叫的,所以方法裡面的$this自然指向了物件$o。很神奇吧。。。。

這個我之前發的那個php範圍解析操作符中都有講,好了基礎就講到這裡,下面直接上多繼承的**了,歡迎吐槽。。。。。

<?php

/*多繼承基類

注:要想實現類多繼承,必需首先繼承此基類

*/class multi_extends

protected function _init_extends()

} }public function _extends($class_name)

} else = $property_value;}}

} //繼承公共方法

$method_list = $ref->getmethods(reflectionmethod::is_public);

foreach ($method_list as $method) }

function __call($m, $a) }}

header('content-type:text/html;charset=utf-8');

class a

}class b }

class c extends multi_extends

}class d }

class persion extends multi_extends

//執行繼承後的方法

$o = new persion();

$o->say_name();

$o->say_age();

$o->say_hellow();

$o->say_goodbye();

PHP利用反射實現依賴注入

本文參考部落格 非常感謝原博主.為了加深理解,做了部分修改,增加了適當注釋.前一篇簡單理解了php依賴注入,在實際開發過程中,我們並不知道依賴的類將來會擴充套件成什麼樣子,因此我們需要在實現依賴注入的時候,通過容器利用php反射類去實現.這裡的容器其實就是乙個能通過反射類實現依賴注入,並且最終返回我...

php 如何實現多繼承

記得有一道面試題問php是否支援多繼承?答案 不可以,只支援單繼承。如何實現多繼承呢?答案 可以使用 inte ce 或 trait 實現 為什麼會想到這個問題,因為想到如果類繼承多個介面,然後他們之間還有相同的屬性和方法會引用誰的方法或屬性,誰又會被覆蓋?總結 1.使用 inte ce 宣告類不能...

php使用 Trait 實現多繼承

trait中的方法會覆蓋 父類中的同名方法,而本類會覆蓋trait中同名方法 優先順序當前類 trait父類 trait中的屬性跟當前類不能相同有的屬性名,屬性名跟屬性值一樣除外,父類private屬性除外 當不同的trait中,卻有著同名的方法或屬性,會產生衝突,可以使用insteadof或 as...