self:: vs className:: 在 PHP 中的静态 className 方法中

2022-08-30 19:05:35

我想除了个人喜好之外可能没有任何区别,但是在阅读各种PHP代码时,我遇到了两种访问方法类的方法。

有什么区别:

class Myclass
{
    public static $foo;

    public static function myMethod ()
    {
        // between:
        self::$foo;
        // and
        MyClass::$foo;
    }
}

答案 1

(注:初始版本说没有区别。其实有)

确实有一个小差异。 转接静态呼叫,但不转接。这只适用于 PHP 5.3+ 中后期的静态绑定self::className::

在静态调用中,PHP 5.3+ 会记住最初调用的类。使用会使 PHP“忘记”此值(即,将其重置为 ),同时保留它。考虑:className::classNameself::

<?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

答案 2

使用self,您可以在类中使用它,也可以在“MyClass”中使用它,就像您一样,您可以在外部引用它:

$instance = new Myclass();
$variable = $instance::$foo

推荐