eli*_*472 53 php static-methods static-members
我对这件事情有点困惑.我正在设计一个ORM类,它试图在ruby on rails上与ActiveRecord非常相似,但这不是重点.
我想说的是我的类广泛使用静态属性继承,特别是对数据库和表处理.我的问题是,我应该使用self ::
Dar*_*one 106
你必须问自己:"我是否用充分的方法来解决问题?"
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();
Run Code Online (Sandbox Code Playgroud)
这将打印
A
Run Code Online (Sandbox Code Playgroud)
另一方面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();
Run Code Online (Sandbox Code Playgroud)
这将打印
B
Run Code Online (Sandbox Code Playgroud)
这在PHP 5.3.0中称为后期静态绑定.它解决了调用运行时引用的类的限制.
考虑到这一点,我认为你现在可以充分地看到并解决问题.如果您继承了几个静态成员并且需要访问父级和子级成员是self::
不够的.
小智 10
尝试使用下面的代码来查看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();
?>
Run Code Online (Sandbox Code Playgroud)
你得到这个结果:
使用Parent_类
- 自我=>父母
- static => parent
使用Child_类
- 自我=>父母
- static =>孩子