self :: vs className :: PHP中的静态className metods

rav*_*ren 16 php static class

我想可能没有任何差别,但个人偏好,但在阅读各种PHP代码时,我遇到了两种方法来访问方法类.

什么区别:

class Myclass
{
    public static $foo;

    public static function myMethod ()
    {
        // between:
        self::$foo;
        // and
        MyClass::$foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

Art*_*cto 35

(注意:初始版本说没有区别.实际上有)

确实存在很小的差异.self::转发静态呼叫,而className::不是.这仅适用于PHP 5.3+中的后期静态绑定.

在静态调用中,PHP 5.3+会记住最初调用的类.使用className::使PHP"忘记"这个值(即,将其重置为className),同时self::保留它.考虑:

<?php
class A {
    static function foo() {
        echo get_called_class();
    }
}
class B extends A {
    static function bar() {
        self::foo();
    }
    static function baz() {
        B::foo();
    }
}
class C extends B {}

C::bar(); //C
C::baz(); //B
Run Code Online (Sandbox Code Playgroud)

  • @Lea这主要是关于风格的问题,但是`self ::`在重构时可以更方便. (6认同)