PHP可以静态::替换self::?

PHP可以静态::替换self::?,php,static-methods,static-members,Php,Static Methods,Static Members,我对这件事有点困惑。我正在设计一个ORM类,它的行为与RubyonRails中的ActiveRecord非常相似,但这并不是重点 我想说的是,我的类广泛使用静态属性继承,特别是用于数据库和表处理。我的问题是,我应该使用self::吗?你必须问自己:“我是否用适当的方法来解决问题?” self::和static::做两件不同的事情。例如,self::或\uuuuuu CLASS\uuuuuuu是对当前类的引用,因此在特定范围内定义它将不足以满足向前静态调用的需要 继承会发生什么 class A {

我对这件事有点困惑。我正在设计一个ORM类,它的行为与RubyonRails中的ActiveRecord非常相似,但这并不是重点

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

你必须问自己:“我是否用适当的方法来解决问题?”

self::
static::
做两件不同的事情。例如,
self::
\uuuuuu CLASS\uuuuuuu
是对当前类的引用,因此在特定范围内定义它将不足以满足向前静态调用的需要

继承会发生什么

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
B
另一方面,使用
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();
这会打印出来

A
B
这就是所谓的。它解决了调用运行时引用的类的限制


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

尝试使用下面的代码来查看selfstatic之间的差异:

<?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();
?>

你会得到这个结果:

使用父类

  • self=>parent
  • static=>parent
使用子类

  • self=>parent
  • 静态=>child

所以基本上,如果我想让事情像平常一样运行,就像在其他语言中一样,我应该使用static来代替?然后,当这些事情真的不重要时,我也可以使用self来实现兼容性。是吗?是的,如果你想要向后兼容,你必须处理self。如果你想以这种方式访问静态成员,你必须使用一个静态方法来包装这些成员。谢谢,还有+1。非常有用首先我认为
static
是错误的方法。听起来像是(如果错了请纠正)你刚刚使你的代码不稳定了。