一尘不染

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

php

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

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


阅读 240

收藏
2020-05-29

共1个答案

一尘不染

您必须问自己:“我要使用适当的方法来解决问题吗?”

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::则将无法满足要求。

2020-05-29