在类中,我们可以通过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
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。