我对这个问题有些困惑。我正在设计一个ORM类,试图让它的行为与Ruby on Rails中的ActiveRecord非常相似,但这不是重点。
我的意思是,我的类广泛使用静态属性继承,特别是用于数据库和表处理。我的问题是,是否应该完全使用self::?
我对这个问题有些困惑。我正在设计一个ORM类,试图让它的行为与Ruby on Rails中的ActiveRecord非常相似,但这不是重点。
我的意思是,我的类广泛使用静态属性继承,特别是用于数据库和表处理。我的问题是,是否应该完全使用self::?
你必须问自己:“我是否用适当的方法解决了问题?”
self::
和static::
执行两个不同的操作。例如,self::
或__CLASS__
是对当前类的引用,在某些作用域中定义它们将不能满足静态调用的需求。
在继承中会发生什么?
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 中称为 延迟静态绑定,它解决了在运行时引用的类限制的问题。
有了这个理解,我认为现在你可以充分看到并解决问题。如果你需要访问父类和子类成员并继承多个静态成员,self::
是不够的。
尝试使用下面的代码来查看self和static之间的区别:
<?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
- static => parent
使用 Child_ 类
- self => parent
- static => child
static
本来就是错误的方法。如果我说错了,请纠正我,但它听起来像是你让你的代码无法测试。 - PeeHaa