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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

本文出自 “黑暗森林” 博客,请务必保留此出处http://mysens.blog.51cto.com/10014673/1856359

以上是关于php父类中访问子类的静态属性的主要内容,如果未能解决你的问题,请参考以下文章

在 kotlin 中,如何从子类访问父类中受保护的静态成员

爪哇 |父类和子类中的静态变量|从父类访问子 var 值

PHP 父类静态方法中调用子类静态方法

面向对象2

java类中属性优先执行顺序

子类能不能继承父类的成员变量