Собственно хотелось бы увидеть различие работы со static:: от parent:: и self::
3 Answers
parent - вызываем родительский метод (не обязательно статичный), self - вызываем метод именно этого класса, static - вызываем метод текущего класса. Разница между self и static хорошо видна, например, когда вы делаете new self() или new static() - в первом случае будет создан объект класса, где упомянут self (т.е. создан родитель), во втором - объект того класса, где вызывается метод (т.е. потомок)
примеры можно посмотреть здесь. "когда применять" - всегда, если только вам не нужен именно текущий класс, а не его наследники. Не знаю когда это может понадобиться, поэтому можете использовать static всегда, потом меньше проблем будет )
в документации можно почитать эту статью, там как раз описано отличие static и self и прочее
(ответ перенесён из комментариев BOPOH)
- 34,094
-
1Не мое дело конечно, но вам не кажется неправильным получать репутацию за человека который это написал? Хотя этот пост я плюсану – MaximPro Feb 19 '16 at 05:39
-
@MaximPro я с вами полностью согласен, поэтому отметил ответ как "общий". Такой ответ не приносит репутации автору. Подробнее читайте тут: http://meta.ru.stackoverflow.com/q/2436/181472 – Nick Volynkin Feb 19 '16 at 05:41
-
-
2@MaximPro, если бы я отвечал на все вопросы, где пишу свои комменты - у меня и рейт был бы больше )) А если бы в свое время (еще на ХК) мои комменты не преобразовывали бы в ответы - у меня было бы около 1К рейтинга. А все потому, что меня рейт мало волнует ) К тому же - я где-то уже писал, что если из моих комментов кто-то соберет нормальный ответ - я не против, даже если ответ будет не общим, а от имени определенного человека – BOPOH Feb 19 '16 at 08:48
-
@BOPOH Понятно, но ведь чем больше рейтинг тем больше привелегий различных – MaximPro Feb 19 '16 at 08:59
-
@MaximPro, а зачем они мне? ) набрать нужный рейтинг не сложно, когда понадобится - тогда и наберем, а пока не вижу в этом смысла )) – BOPOH Feb 19 '16 at 09:06
-
Пример отличия "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'
- 549
self — класс в котором написано.
static — класс в котором выполнилось.
Например, если вызвать унаследованный метод в котором self / static, то каждый вариант даст разный результат.
- 4,812
new static()использовать (иначе не понятно будет, почему в классе B получили объект родительского класса A). И ни разу не видел, чтобы parent использовали именно для создания объекта (вызов конструктора родительского класса в конструкторе дочернего не считается), хотя это и возможно – BOPOH Feb 19 '16 at 04:25