Где разница между self и $ this-> в классе PHP или в методе PHP? - PullRequest
14 голосов
/ 22 декабря 2009

Где разница между self и $this-> в классе PHP или методе PHP?

Пример:

Я недавно видел этот код.

public static function getInstance() {

    if (!self::$instance) {
        self::$instance = new PDO("mysql:host='localhost';dbname='animals'", 'username', 'password');;
        self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    return self::$instance;
}

Но я помню, что $this-> относится к текущему экземпляру (объекту) класса (также может быть неверным). Однако в чем разница?

Ответы [ 7 ]

17 голосов
/ 22 декабря 2009

$this относится к экземпляру класса, это правильно. Однако есть также нечто, называемое статическим состоянием, которое одинаково для всех экземпляров этого класса. self:: является средством доступа к этим атрибутам и функциям.

Кроме того, вы не можете нормально получить доступ к элементу экземпляра статическим методом. Это означает, что вы не можете сделать

static function something($x) {
  $this->that = $x;
}

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

11 голосов
/ 22 декабря 2009

$this относится к текущему объекту, self относится к текущему классу. Класс - это план объекта. Итак, вы определяете класс, но создаете объекты.

То есть, другими словами, используйте self для static, а это для нестатических членов или методов.

3 голосов
/ 18 мая 2017
  1. this-> не может получить доступ к статическому методу или статическому атрибуту, мы используем self для доступа к ним.
  2. $ this-> когда работа с расширенным классом будет ссылаться на текущую расширенную область, self всегда будет ссылаться на родительский класс, потому что ему не нужен экземпляр для доступа к методу класса или для доступа к классу. непосредственно.

    <?php
    class FirstClass{
      function selfTest(){
        $this->classCheck();
        self::classCheck();
      } 
      function classCheck(){
        echo "First Class";
      }
    }
    class SecondClass extends FirstClass{
        function classCheck(){
          echo "Second Class";
        }
    }
    $var = new SecondClass();
    $var->selfTest(); //this-> will refer to Second Class , where self refer to the parent class
    
3 голосов
/ 22 декабря 2009

self используется в области уровня класса, тогда как $this используется в области уровня экземпляра.

2 голосов
/ 08 июня 2015

$ this используется для вызова экземпляра класса, где self :: в основном используется для вызова постоянной переменной в классе.

2 голосов
/ 22 декабря 2009

$this используется для ссылки на методы и свойства текущего экземпляра класса.

self используется для ссылки на статические методы и свойства, общие для всех экземпляров (и даже доступные вне любого экземпляра) класса.


Вы можете взглянуть на Статическое ключевое слово (цитируя несколько строк) :

Объявление свойств или методов класса поскольку статика делает их доступными без необходимости создания экземпляров класс. Недвижимость, объявленная как статические не могут быть доступны с экземпляр объекта класса (хотя статический метод может)

...

Статические свойства недоступны через объект с помощью стрелки оператор ->.


А со страницы Свойства (цитирование) :

В методах класса свойства, константы и методы могут быть доступны используя форму $this->property (где property - название объекта) , если только доступ к статическое свойство в контексте метод статического класса, в этом случае доступ к нему осуществляется через форму self::$property.

1 голос
/ 22 декабря 2009

self относится к классу вызывающего объекта. $this относится к самому объекту.

...