self :: vs className :: внутри статических методов className в PHP - PullRequest
15 голосов
/ 14 августа 2010

Я полагаю, что не может быть никакой разницы, кроме личных предпочтений, но при чтении различного PHP-кода я сталкиваюсь с обоими способами доступа к классу методов.

Что такое разница:

class Myclass
{
    public static $foo;

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

Ответы [ 2 ]

34 голосов
/ 14 августа 2010

(Примечание: в первоначальной версии говорилось, что разницы нет. На самом деле, есть)

Разница действительно небольшая.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
1 голос
/ 14 августа 2010

С помощью self вы можете использовать его внутри класса, а с помощью «MyClass», как и у вас, вы можете ссылаться на него внешне:

$instance = new Myclass();
$variable = $instance::$foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...