self, static, parent - конструкции в PHP, которые позволяют обращаться к каким-либо методам, свойствам в классе (классах) или к самому классу.
parent - обращается к родительскому методу/свойству
self - обращается к методу/свойству того класса, в котором был вызван
static - обращается к методам/свойствам текущего класса
Пример self
<?php
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
Класс User унаследовал метод getTable() от Model, но self вызывается в Model, значит и свойство $table берется из Model.
Если перегрузить метод getTable() в классе User, то self уже будет, в первую очередь, в User, значит и свойство $table будет браться из User.
class User extends Model {
public static $table = 'users';
public static function getTable() {
return self::$table;
}
}
echo User::getTable(); //Выведет users
Пример static
<?php
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
Класс User унаследовал метод getTable() от Model, но поскольку вызывается static, то текущий класс для static - это User т.к. через него вызывается getTable(), значит возьмется свойство $table из User.
Примечание. В этом примере, если свойство
$tableне будет объявлено уUserто даже в случаеstaticбудет возвращено свойство$tableродительского класса т.к. оно было унаследовано.
Пример parent
<?php
class Model {
public static $table = 'table';
public static function getTable() {
return static::$table;
}
}
class User extends Model {
public static $table = 'users';
public static function getProperty() {
return parent::$table;
}
}
echo User::getProperty(); //Выведет table
Просто получаем свойство родительского класса через parent::$table.
Другой момент, если мы обратимся через parent к родительскому методу, который возвращает static то обращение будет, все равно, к текущему.
<?php
class Model {
public static $table = 'table';
public static function getTable() {
return static::$table;
}
}
class User extends Model {
public static $table = 'users';
public static function getProperty() {
return parent::getTable();
}
}
echo User::getProperty(); //Выведет users
Можно попробовать запомнить по следующему принципу:
static - Не важно в каком классе используется static. Какой класс вызван тот и будет главным.
self - Не важно какой класс был вызван. В каком классе прописан self, тот класс и будет главным.