Отличия self, static и parent в ООП php

23 Августа 2022 23:14

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