Когда использовать self vs $this в PHP?


Вижу, как сомнения, очень частые:

, Когда мы должны использовать self::, либо $this в PHP. Какой способ является более подходящим для использования, и какая разница из 2 ситуаций?

Author: William Aparecido Brandino, 2013-12-18

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
 64
Author: rodrigorgs, 2013-12-18 11:41:13

Разница В том, что self-это когда класса (или экземпляра), находится в контексте, статический (будь то метод или свойство), и очевидно, что this-это, когда не является статическим.

 5
Author: Brayan, 2013-12-18 11:16:01

$this используется внутри класса, чтобы получить доступ к свойствам/методам объекта. self используется для доступа к статическим членам.

 3
Author: rray, 2013-12-18 11:53:06

$this указывает на объект, и self указывает на класс сам по себе.

Self может быть также использован, когда класс расширяет другой, и вы хотите получить доступ к реализации его или ее родственнике, например,

self::teste();

,

parent::teste();

Но, как правило, self будет использоваться для доступа к статические данные класса.

 3
Author: Guerra, 2013-12-20 11:16:08

В целом, мы используем $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, компьютеры останутся в настоящее время продаются даже если он уже закончил.

(Этот пример-это просто образовательные!)

 3
Author: Ed Cesar, 2017-01-27 23:47:33