您好,登錄后才能下訂單哦!
在類中,我們可以通過self訪問本類或父類中的靜態屬性/靜態方法,可以通過parent訪問父類中的靜態屬性/靜態方法。
可我們卻沒有關鍵字從父類中的方法訪問子類的靜態屬性,這是由于父類是先于子類創建的,所以從邏輯上來講從父類中訪問子類的靜態屬性并不是一個好的選擇。
但有些時候我們不得不這樣做,那么我們可以通過get_class()方法實現:
get_class()返回的是本對象名,
get_class(obj)返回的是對象obj的名,
看下面這個例子:
<?php class A { function getName() { echo get_class(); echo get_class($this); } } class B extends A { } $a = new A(); $b = new B(); $a->getName(); $b->getName();
結果:AAAB
---------------------------------------------------------------
有了子類對象名,在利用eval()方法,我們就可以實現在父類方法中訪問子類靜態屬性了:
<?php class A { function getName() { $class = get_class($this); eval('$name='.$class.'::$name;'); echo $name; } } class B extends A { public static $name = 'B'; } class C extends A { public static $name = 'C'; } $b = new B(); $c = new C(); $b->getName(); $c->getName();
結果:BC
----------------------------------
如果父類中使用的是靜態方法,不能使用$this,那么是不是就沒辦法了呢?
當然不是!
將A類改成如下
便可兼容靜態方法調用
<?php class A { static function getName() { $class = get_called_class(); eval('$name='.$class.'::$name;'); echo $name; } } class B extends A { public static $name = 'B'; } class C extends A { public static $name = 'C'; } B::getName(); c::getName();
結果BC
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。