2009-12-22 5 views
12

Где разница между 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-> относится к текущему экземпляру (объекта) класса (также может быть неправильно). Однако в чем разница?

+4

Дубликат: http://stackoverflow.com/questions/151969/php-self-vs-this – inkedmn

+1

Очень хороший источник для вас - http://www.programmerinterview.com/index.php/php-questions/php-self-vs-this/ – Sudara

ответ

15

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

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

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

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

+0

self :: внутри объекта относится к тем же свойствам/методам уровня наследования, где $ this-> относится к унаследованным методам объекта. Другими словами, self: более точно. И внутри инициализированного объекта он также не является статическим вызовом, если вы не зададите явно определенные статические свойства/методы. Этот «ответ» неверен сверху донизу. – AnrDaemon

+0

@AnrDaemon Я не знаю, сколько вам лет, но прежде чем вы получили свою степень в задним числом, этот ответ был на 100% правильным. Я не знаю, что сделал PHP позже, так как я прекратил использовать его, когда разработчики начали демонстрировать вопиющее пренебрежение качеством или эмпирическими данными для принятия своих решений. Вероятно, это было до этого ответа. Также этот ответ справедлив на всех других объектно-ориентированных языках с уважением к самому себе. Если это не в PHP, то PHP ошибочен, а не я. Спасибо за ваш вклад, он был отмечен и отброшен. –

+0

@TorValamo нет, ваш ответ правильный. Вероятно, комментатор был смущен использованием «этого» в JavaScript, который сохраняет поиск в текущем контексте. – SuperDuck

3

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

1

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

7

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

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

2

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

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


Вы можете посмотреть на Static Keyword(со ссылкой на несколько строк):

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

...

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


И, со страницы Properties(со ссылкой):

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

1

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

1
  1. это-> не может получить доступ к статическому методу или статическому атрибуту, мы используем self для доступа к ним.
  2. $ this-> при работе с расширенным классом будет ссылаться на текущую область действия, которую u расширил, 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 
    

 Смежные вопросы

  • Нет связанных вопросов^_^