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
, тот класс и будет главным.