Когда использовать self vs $this в PHP?
Вижу, как сомнения, очень частые:
, Когда мы должны использовать self::
, либо $this
в PHP. Какой способ является более подходящим для использования, и какая разница из 2 ситуаций?
5 answers
Упрощенной форме) $this
, ссылается на объект (экземпляр), и self
относится к классу. Таким образом, как правило, использует-$this
для доступа к членам (атрибуты, методы) экземпляра self
для доступа к статическим членам.
Наследство
, если вы используете наследование, однако, есть разница между использованием self
$this
при вызове метода экземпляра:
-
self::metodo()
называетmetodo()
текущего класса; -
$this->metodo()
называетmetodo()
класса используется для создания экземпляра объекта, который выполняется (который может быть подклассом класса, где вызов). Вы можете узнать, что класс это, используяget_class($this)
.
Например:
<?php
class Animal {
public function teste() {
echo "\$this é instância de " . get_class($this) . "\n";
// chama Animal::fala(), independentemente do
// tipo da instância
echo "self::fala(): ";
self::fala();
// chama fala() na classe usada pra instanciar
// este objeto
echo "\$this->fala(): ";
$this->fala();
}
public function fala() {
echo "Oi\n";
}
}
class Gato extends Animal {
public function fala() {
echo "Miau\n";
}
}
// Nesse caso, self != get_class($this)
// - self == Animal
// - get_class($this) == Gato
$gato = new Gato();
$gato->teste();
echo "\n";
// Nesse caso, self == get_class($this) == Animal
$animal = new Animal();
$animal->teste();
?>
Результат:
$this é instância de Gato
self::fala(): Oi
$this->fala(): Miau
$this é instância de Animal
self::fala(): Oi
$this->fala(): Oi
Разница В том, что self-это когда класса (или экземпляра), находится в контексте, статический (будь то метод или свойство), и очевидно, что this-это, когда не является статическим.
$this
используется внутри класса, чтобы получить доступ к свойствам/методам объекта.
self
используется для доступа к статическим членам.
$this указывает на объект, и self указывает на класс сам по себе.
Self может быть также использован, когда класс расширяет другой, и вы хотите получить доступ к реализации его или ее родственнике, например,
self::teste();
,
parent::teste();
Но, как правило, self будет использоваться для доступа к статические данные класса.
В целом, мы используем $this
для поддержания туннеля и избежать столкновений сведения объекта на другой.
Если по какой-то причине вам нужно поделиться информацией с всех экземпляров класса, ai, которые входят переменные estaticas, давайте посмотрим на пример:
<?php
class Notebook
{
private static $quantidadeDisponivel = 5;
public function getQuantidadeDisponivel()
{
return self::$quantidadeDisponivel;
}
public function comprar()
{
/**
* Realiza o processo de compra do notebook e atualiza quantidade disponivel
*/
self::$quantidadeDisponivel--;
}
}
$carrinhoJoao = new Notebook;
$carrinhoJoao->comprar();
$notebooksRestantes = $carrinhoJoao->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 4
$carrinhoPedro = new Notebook;
$carrinhoPedro->comprar();
$notebooksRestantes = $carrinhoPedro->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 3
$carrinhoPaulo = new Notebook;
$carrinhoPaulo->comprar();
$notebooksRestantes = $carrinhoPaulo->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 2
$carrinhoJoao->comprar();
$notebooksRestantes = $carrinhoJoao->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 1
$carrinhoPedro->comprar();
$notebooksRestantes = $carrinhoPedro->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 0
Без использования переменной statica, это не так просто сделать этот элемент управления, вы посмотрите:
class Desktop
{
private $quantidadeDisponivel = 5;
public function getQuantidadeDisponivel()
{
return $this->quantidadeDisponivel;
}
public function comprar()
{
/**
* Realiza o processo de compra do notebook e atualiza a quantidade disponível
*/
$this->quantidadeDisponivel--;
}
}
$carrinhoJoao = new Desktop;
$carrinhoJoao->comprar();
$notebooksRestantes = $carrinhoJoao->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 4
$carrinhoPedro = new Desktop;
$carrinhoPedro->comprar();
$notebooksRestantes = $carrinhoPedro->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 4
$carrinhoPaulo = new Desktop;
$carrinhoPaulo->comprar();
$notebooksRestantes = $carrinhoPaulo->getQuantidadeDisponivel();
print $notebooksRestantes; // imprime 4
Как мы видели, с использованием переменной statica у нас был результат 4,3,2,1,0 и с переменной общего у нас 4,4,4, компьютеры останутся в настоящее время продаются даже если он уже закончил.
(Этот пример-это просто образовательные!)