Используйте $this, чтобы получить доступ к текущему объекту. Используйте self, чтобы сослаться на текущий класс. Другими словами, используйте $this->member для нестатического свойства, а self::$member — для статического.
Ключевое слово «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().