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
- 静态=>孩子