Различия в static и self для методов класса, простым языком
Не знаю как вы, а я еще с детского садика плохо усваиваю определения, пока они мне не пригодятся в реальной жизни. Так и с ключевым словом static в классах PHP. Фактически, это замена self, появившееся не так давно (или давно) в PHP, за некоторыми исключениями. Но начну я со своей задачи.
А задача у меня достаточно хитрая. Представим, что есть класс А, от него наследуется класс Б. И вот хорошо бы, в методе М1 класса Б, вызвать переопределяемый метод М1 родителя А, но с условием, чтобы родитель вызвал метод текущего класса, НО если он есть у пасынка. В ином случае вызывал бы свой метод. Ничего не понятно? Возможно. Но задача для архитектуры оказалась крайне важна, и тут я вспомнил про static, может он мне наконец пригодится.
Я накидал "абстрактные" три класса, чтобы передать суть:
class Father
{
public static function money()
{
return __CLASS__.'\'s money';
}
public static function life()
{
return self::money();//!!!
}
}
class Son1 extends Father
{
public static function money()
{
return __CLASS__.'\'s money';
}
public static function life()
{
return parent::life();
}
}
class Son2 extends Father
{
public static function life()
{
return parent::life();
}
}
echo Son1::life();
echo '<br>';
echo Son2::life(); |
Человеческим языком это озвучивается просто. У первого сына есть свои деньги, и в жизни он применяет их. А второй сын лоботряс, сидит у папы на шее, и у него нет денег. И вот моя задача, чтобы код вывел:
Son's money
Father's money
|
Сначала запустим код выше как вы его видите, со старым знакомым self в строке, помеченное тремя !!!.
Вывело

Father's money
Father's money
|
И тут вставляем наше слово static:
class Father
{
public static function money()
{
return __CLASS__.'\'s money';
}
public static function life()
{
return static::money();//!!!
}
}
class Son1 extends Father
{
public static function money()
{
return __CLASS__.'\'s money';
}
public static function life()
{
return parent::life();
}
}
class Son2 extends Father
{
public static function life()
{
return parent::life();
}
}
echo Son1::life();
echo '<br>';
echo Son2::life(); |
.
Задача решена

Son1's money
Father's money
|
PS: Если вам действительно интересно, почему нельзя было дублировать код отца в сыновьях, применяя self, то вот ответ. В конструкторе обрабатывается много действий, классов может быть много, и некоторые методы отца могут переопределяться в сыновьях. Поэтому, вроде бы и self нужен, но не совсем self.
Назад в раздел