PHP: какая разница между self и $this?

Используйте $this, чтобы получить доступ к текущему объекту. Используйте self, чтобы сослаться на текущий класс. Другими словами, используйте $this->member для нестатического свойства, а self::$member — для статического.

Ответ №2

Ключевое слово «self» не просто ссылается на текущий класс; по крайней мере его возможности не ограничивается доступом к статическим свойствам. В контексте нестатических свойств, «self» также обеспечивает возможность обхода таблицы виртуальных методов для текущего объекта. Например, parent::methodName() вызывает родительскую версию метода, а self::methodName() вызовет метод, который реализован в текущем классе.

class Person {
private $name;

public function __construct($name) {
$this->name = $name;
}

public function getName() {
return $this->name;
}

public function getTitle() {
return $this->getName()." the person";
}

public function sayHello() {
echo "Hello, I''m ".$this->getTitle()."<br/>";
}

public function sayGoodbye() {
echo "Goodbye from ".self::getTitle()."<br/>";
}
}

class Geek extends Person {
public function __construct($name) {
parent::__construct($name);
}

public function getTitle() {
return $this->getName()." the geek";
}
}

$geekObj = new Geek("Ludwig");
$geekObj->sayHello();
$geekObj->sayGoodbye();

На выходе получим:

Hello, I»m Ludwig the geek
Goodbye from Ludwig the person

sayHello() использует указатель $this, так что таблица виртуальных методов вызовет Geek::getTitle().
sayGoodbye() использует self::getTitle(), так что таблица виртуальных методов будет не задействована, и вызовется Person::getTitle().