PHP 可以静态:: 替换 self::?
2022-08-30 09:35:18
						我对这件事有点困惑。我正在设计一个ORM类,它试图在轨道上的ruby中表现得与ActiveRecord非常相似,但这不是重点。
我想说的是,我的类广泛使用静态属性继承,特别是对于数据库和表处理。我的问题是,我应该使用self::吗?
我对这件事有点困惑。我正在设计一个ORM类,它试图在轨道上的ruby中表现得与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_ 类
- 自我 = > 父母
 - 静态 = > 父级
 使用 Child_ 类
- 自我 = > 父母
 - 静态 = > 子级