您好,登錄后才能下訂單哦!
在類中,我們可以通過(guò)self訪問(wèn)本類或父類中的靜態(tài)屬性/靜態(tài)方法,可以通過(guò)parent訪問(wèn)父類中的靜態(tài)屬性/靜態(tài)方法。
可我們卻沒(méi)有關(guān)鍵字從父類中的方法訪問(wèn)子類的靜態(tài)屬性,這是由于父類是先于子類創(chuàng)建的,所以從邏輯上來(lái)講從父類中訪問(wèn)子類的靜態(tài)屬性并不是一個(gè)好的選擇。
但有些時(shí)候我們不得不這樣做,那么我們可以通過(guò)get_class()方法實(shí)現(xiàn):
get_class()返回的是本對(duì)象名,
get_class(obj)返回的是對(duì)象obj的名,
看下面這個(gè)例子:
<?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();
結(jié)果:AAAB
---------------------------------------------------------------
有了子類對(duì)象名,在利用eval()方法,我們就可以實(shí)現(xiàn)在父類方法中訪問(wèn)子類靜態(tài)屬性了:
<?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();
結(jié)果:BC
----------------------------------
如果父類中使用的是靜態(tài)方法,不能使用$this,那么是不是就沒(méi)辦法了呢?
當(dāng)然不是!
將A類改成如下
便可兼容靜態(tài)方法調(diào)用
<?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();
結(jié)果BC
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。