首页 > IT知识 > PHP父类中访问子类的静态属性

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

2016年10月12日14:46:48来源:海文国际         57
分享到:
IT知识文章: 


  在类中,我们可以通过self访问本类或父类中的静态属性/静态方法,可以通过parent访问父类中的静态属性/静态方法。

  可我们却没有关键字从父类中的方法访问子类的静态属性,这是由于父类是先于子类创建的,所以从逻辑上来讲从父类中访问子类的静态属性并不是一个好的选择。

  但有些时候我们不得不这样做,那么我们可以通过get_class()方法实现:get_class()返回的是本对象名,get_class(obj)返回的是对象obj的名,看下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class A
{
   function getName()
   {
       echo get_class();
       echo get_class($this);
   }
}
 
class extends A
{
     
}
 
$a new A();
$b new B();
$a->getName();
$b->getName();

结果:AAAB

---------------------------------------------------------------

  有了子类对象名,在利用eval()方法,我们就可以实现在父类方法中访问子类静态属性了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class A
{
   function getName()
   {
       $class = get_class($this);
       eval('$name='.$class.'::$name;');
       echo $name;
   }
}
 
class extends A
{
    public static $name 'B';
}
 
class extends A
{
    public static $name 'C';
}
 
$b new B();
$c new C();
$b->getName();
$c->getName();

结果:BC

----------------------------------

  如果父类中使用的是静态方法,不能使用$this,那么是不是就没办法了呢?

  当然不是!

  将A类改成如下,便可兼容静态方法调用 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class A
{
   static function getName()
   {
       $class = get_called_class();
       eval('$name='.$class.'::$name;');
       echo $name;
   }
}
 
class extends A
{
    public static $name 'B';
}
 
class extends A
{
    public static $name 'C';
}
 
B::getName();
c::getName();

结果BC