PHP可以static :: replace self ::?

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

  • 所以基本上如果我希望事情像往常一样,就像在其他所有语言中一样,我应该使用静态代替?然后,当这些事情并不重要时,我也可以使用self来兼容.那是对的吗? (8认同)
  • 没错,如果你想要向后兼容,你就必须处理自我.如果要以这种方式访问​​静态成员,则必须执行包装成员的静态方法. (8认同)

小智 10

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

你得到这个结果:

使用Parent_类

  • 自我=>父母
  • static => parent

使用Child_类

  • 自我=>父母
  • static =>孩子