Помогите мне понять, как $ this используется в PHP - PullRequest
5 голосов
/ 27 августа 2010

На простом английском языке, как $this используется в PHP?

Это такая простая концепция для меня в JavaScript, но по какой-то причине в PHP я не могу разобраться с этой переменной и ее функцией. Что в любой данный момент относится к точно ? У меня только высший опыт работы с ООП, и я подозреваю, поэтому мне сложно понять его использование, но я пытаюсь стать лучше, и большая часть кода, который я проверяю, использует эту переменную.

Ответы [ 2 ]

15 голосов
/ 27 августа 2010

На очень простом английском:

Оказавшись внутри функции объекта, вы получаете полный доступ к его переменным, но для их установки вам нужно быть более конкретным, чем просто использовать имя переменной, с которой вы хотите работать.Чтобы правильно указать, что вы хотите работать с локальной переменной, вам нужно использовать специальную переменную $this, которую PHP всегда устанавливает для указания на объект, с которым вы сейчас работаете.

Например:

function bark()
{
    print "{$this->Name} says Woof!\n";
} 

Когда вы находитесь внутри функции объекта, PHP автоматически устанавливает переменную $this, содержащую этот объект.Вам не нужно ничего делать, чтобы иметь к нему доступ.


На обычном английском языке:

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

Пример:

<?php
class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this is defined (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this is not defined.\n";
        }
    }
}

class B
{
    function bar()
    {
        // Note: the next line will issue a warning if E_STRICT is enabled.
        A::foo();
    }
}

$a = new A();
$a->foo();

// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo();
$b = new B();
$b->bar();

// Note: the next line will issue a warning if E_STRICT is enabled.
B::bar();
?>

Выход:

$this is defined (A)
$this is not defined.
$this is defined (B)
$this is not defined.
2 голосов
/ 27 августа 2010

Для разработки шамтомар:

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

class SaySomething{
        private $the_line;// the variable exists only in this class!
        public function __construct($myline){
            $this->the_line = $myline;
           // see how it points to itself?
           // would there be a variable in the global scope then it would be not possible to "setup"
           // the object without it getting overwritten in the next setup.
        }

        //The function to echo the stuf. Can be callid by the "outside world"
        public function say_it(){
            echo $this->the_line;
            $this->add_exclamation();//call the function add_exclamation in this class/object.
        }

       //This function can not be called by the outside world because it's private.
       // The only way to call it is from inside this class. To point to this class and call the function:
       // $this->add_exclamation();
        private function add_exclamation(){
            echo "!";
        }

    }

    $obja = new SaySomething('my');
    $objb = new SaySomething('sample');
    $objc = new SaySomething('super');
    $objd = new SaySomething('text');

    //Mind: uptill nothing has been said, only the private variable $the_line has been set in the constructor.
    $obja->say_it();
    $objc->say_it();
    $objb->say_it();
    $objd->say_it();

Чтобы понять, что такое класс и что такое объект (они часто смешиваются ...), посмотрите это слайд-шоу: http://www.slideshare.net/sebastian_bergmann/understanding-the-php-object-model

...