Ключевое слово self НЕ относится только к «текущему классу», по крайней мере, не таким образом, чтобы ограничивать вас статическими членами. В контексте нестатического члена, self
также предоставляет способ обхода vtable ( см. Вики на vtable ) для текущего объекта. Так же, как вы можете использовать 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()."
";
}
public function sayGoodbye() {
echo "Goodbye from ".self::getTitle()."
";
}
}
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();
Это выведет:
Привет, я Людвиг, выродок
Прощай, Людвиг, человек
sayHello()
использует указатель $this
, поэтому vtable вызывается для вызова Geek::getTitle()
. sayGoodbye()
использует self::getTitle()
, поэтому vtable не используется, и вызывается Person::getTitle()
. В обоих случаях мы имеем дело с методом экземпляра объекта и имеем доступ к указателю $this
в вызываемых функциях.
Низкоуровневая библиотека для работы с 7z.dll (поддерживает архивы rar, в том числе многослойные, работает с потоками .net):
Интерфейс C # (.net) для архива 7-Zip dlls
И более высокоуровневые библиотеки на основе первой: