溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php父類中訪問(wèn)子類的靜態(tài)屬性

發(fā)布時(shí)間:2020-03-31 07:58:43 來(lái)源:網(wǎng)絡(luò) 閱讀:905 作者:zcfortest 欄目:web開(kāi)發(fā)

在類中,我們可以通過(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

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI