PHP可以使用static::代替self::吗?

60

我对这个问题有些困惑。我正在设计一个ORM类,试图让它的行为与Ruby on Rails中的ActiveRecord非常相似,但这不是重点。

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


我认为static本来就是错误的方法。如果我说错了,请纠正我,但它听起来像是你让你的代码无法测试。 - PeeHaa
2个回答

117

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

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:: 是不够的。


9
所以基本上,如果我希望事物的行为表现得像其他语言一样正常,我应该使用 static 吗?然后当这些事情并不真的重要时,我也可以使用 self 来实现兼容性,是这样吗? - elite5472
9
没错,如果想要向后兼容就必须处理 self。如果你想用这种方式访问静态成员,必须使用一个包装成员的静态方法。 - DarkThrone

11

尝试使用下面的代码来查看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();
?>

你会得到这个结果:

使用 Parent_ 类

  • self => parent
  • static => parent

使用 Child_ 类

  • self => parent
  • static => child

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接