PHP: self:: vs parent:: with extends

Мне интересно, в чем разница между использованием self:: и parent:: когда статический дочерний класс расширяет статический родительский класс, например.

class Parent {

    public static function foo() {
       echo 'foo';
    }
}

class Child extends Parent {

    public static function func() {
       self::foo();
    }

    public static function func2() {
       parent::foo();
    }
}

Есть ли разница между func() и func2(), и если да, то что это такое?

Спасибо

Привет

Ответ 1

                Child has foo()     Parent has foo()
self::foo()        YES                   YES               Child foo() is executed
parent::foo()      YES                   YES               Parent foo() is executed
self::foo()        YES                   NO                Child foo() is executed
parent::foo()      YES                   NO                ERROR
self::foo()        NO                    YES               Parent foo() is executed
parent::foo()      NO                    YES               Parent foo() is executed
self::foo()        NO                    NO                ERROR
parent::foo()      NO                    NO                ERROR

Если вы ищете правильные случаи для их использования. parent разрешает доступ к унаследованному классу, тогда как self является ссылкой на класс, к которому принадлежит метод (статический или другой).

Популярное использование ключевого слова self при использовании шаблона Singleton в PHP, self не выполняет дочерние классы, тогда как static делает New self vs. новый статический

parent предоставляет возможность доступа к унаследованным методам класса, часто полезно, если вам нужно сохранить некоторые функции по умолчанию.

Ответ 2

self используется для вызова статической функции и управления статическими переменными, которые не зависят от конкретного объекта.