#php
Собственно хотелось бы увидеть различие работы со static:: от parent:: и self::
Ответы
Ответ 1
parent - вызываем родительский метод (не обязательно статичный), self - вызываем метод именно этого класса, static - вызываем метод текущего класса. Разница между self и static хорошо видна, например, когда вы делаете new self() или new static() - в первом случае будет создан объект класса, где упомянут self (т.е. создан родитель), во втором - объект того класса, где вызывается метод (т.е. потомок) примеры можно посмотреть здесь. "когда применять" - всегда, если только вам не нужен именно текущий класс, а не его наследники. Не знаю когда это может понадобиться, поэтому можете использовать static всегда, потом меньше проблем будет ) в документации можно почитать эту статью, там как раз описано отличие static и self и прочее (ответ перенесён из комментариев BOPOH)Ответ 2
Пример отличия "static::" от "self::". Создадим класс 'Model' (базовый) и дочерний 'Users' 1) В этом случае "self::" находится в родительском классе, следовательно берет данные из родительского(от туда где он находится). class Model { public static $table='table'; public static function getTable() { return self::$table; } } class User extends Model{ public static $table='users'; } echo User::getTable(); //выведет 'table' 2) В этом случае "static::" берет данные из вызывающего класса, в нашем случае 'Users'. class Model { public static $table='table'; public static function getTable() { return static::$table; } } class User extends Model{ public static $table='users'; } echo User::getTable(); //выведет 'users' 3) И здесь "parent::" используется для доступа к методам и свойствам базового (родительского) класса. Здесь мы, в дочернем классе, переопределили метод базового класса( foo() ), но с помощью "parent::" все еще можем обратиться к родительскому методу. class Model { public static $table='table'; public static function foo() { echo "1_test"; } } class User extends Model{ public static function foo() { echo "2_test"; parent::foo(); } } echo User::foo(); //выведет '2_test1_test'Ответ 3
self — класс в котором написано. static — класс в котором выполнилось. Например, если вызвать унаследованный метод в котором self / static, то каждый вариант даст разный результат. Late Static Binding.
Комментариев нет:
Отправить комментарий