php父类中访问子类的静态属性

在类中,我们可以通过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