PHP可以静态::取代自我::?

我对这件事有点困惑。 我正在devise一个ORM类,它试图在Ruby on Rails上与ActiveRecord非常类似,但这不是重点。

我想说的是我的类广泛使用静态属性inheritance,特别是数据库和表处理。 我的问题是,我应该使用self ::吗?

你必须问自己:“我是否用适当的方法来处理这个问题?”

self::static::做两个不同的事情。 例如self::__CLASS__是对当前类的引用,因此在某些范围内定义它不足以满足前向静态调用的需要。

inheritance会发生什么?

 class A { public static function className(){ echo __CLASS__; } public static function test(){ self::className(); } } class B extends A{ public static function className(){ echo __CLASS__; } } B::test(); 

这将打印

 A 

另一方面与static::它有预期的行为

 class A { public static function className(){ echo __CLASS__; } public static function test(){ static::className(); } } class B extends A{ public static function className(){ echo __CLASS__; } } B::test(); 

这将打印

 B 

这在PHP 5.3.0中称为后期静态绑定 。 它解决了调用在运行时引用的类的限制。

考虑到这一点,我认为你现在可以充分地看到并解决问题。 如果你inheritance了几个静态成员,并且需要访问父和子成员self::将不够用。

试着用下面的代码来看看自我静态之间的区别:

 <?php class Parent_{ protected static $x = "parent"; public static function makeTest(){ echo "self => ".self::$x."<br>"; echo "static => ".static::$x; } } class Child_ extends Parent_{ protected static $x = "child"; } echo "<h4>using the Parent_ class</h4>"; Parent_::makeTest(); echo "<br><h4>using the Child_ class</h4>"; Child_::makeTest(); ?> 

你会得到这个结果:

使用Parent_类

  • self => parent
  • 静态=>父

使用Child_类

  • self => parent
  • 静态=>孩子