Php class this in method

Объектно-ориентированное программирование

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

Ключевыми понятиями парадигмы ООП являются понятия «класс» и «объект». Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека — этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является объектом или экземпляром этого класса.

Для создания класса в PHP используется ключевое слово class , после которого идет название класса и фигурные скобки <> — блок кода класса. Например, новый класс, представляющий пользователя:

Чтобы создать объект класса Person, применяется ключевое слово new :

 $person = new Person(); print_r($person); ?>

В данном случае переменная $person является объектом класса Person . С помощью функции print_r() можно вывести содержимое объекта, как и в случае с массивами.

При этом неважно, определяется класс до или после создания объекта. Например, мы можем сначала определить переменную класса, а потом определить этот класс:

Свойства и методы

Класс может содержать переменные, которые описывают какие-то признаки объекта, его состояние и которые еще назывют свойствами или атрибутам. И также класс класс может содержать функции, которые еще назвают методами и которые определяют его поведение.

Так, добавим в класс Person несколько свойств и методов:

"; > > $tom = new Person(); $tom->name = "Tom"; // установка свойства $name $tom->age = 36; // установка свойства $age $personName = $tom->name; // получение значения свойства $name echo "Имя пользователя: " . $personName . "
"; $tom->hello(); // вызов метода hello() print_r($tom); ?>

Здесь класс Person содержит два свойства: $name и $age . Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа — в данном случае модификатор public .

Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция hello() просто выводит приветствие.

После создания объекта класса Person:

Мы можем через имя переменной класса обращаться к его свойствам и методам. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа -> . Например, установить значения свойств:

$tom->name = "Tom"; // установка свойства $name $tom->age = 36; // установка свойства $age

Или получить значение (например, присвоить его переменной):

$personName = $tom->name; // получение значения свойства $name

Или вызвать методы объекта:

$tom->hello(); // вызов метода hello()

В итоге мы получим следующий вывод браузера:

Имя пользователя: Tom Hello! Person Object ( [name] => Tom [age] => 36 )

При этом свойствам можно задать в классе некоторые начальные значения:

"; > > $tom = new Person(); $tom->age = 36; // установка свойства $age echo "Имя пользователя: " . $tom->name . "
"; echo "Возраст пользователя: " . $tom->age . "
"; ?>
Имя пользователя: Undefined Возраст пользователя: 36

Ключевое слово this

Для обращения к свойствам и методам объекта внутри его класса применяется ключевое слово this . Например, определим в классе метод для вывода информации об объекте:

name ."; Age: " . $this->age . "
"; // также можно написать // echo "Name: $this->name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> displayInfo(); // Name: Tom; Age: 18 ?>

Для обращения к полям и методам внутри класса также применяется оператор доступа -> , перед которым идет $this . Причем это $this указывает именно на текущий объект. Что это значит в практическом плане? Например:

name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> displayInfo(); $bob = new Person(); $bob -> name = "Bob"; $bob -> age = 25; $bob -> displayInfo(); ?>

$this фактически будет указывать на переменную $tom . Тогда как при вызове

Читайте также:  Absolute path python windows

$this будет указывать на переменную $bob .

Name: Tom; Age: 18 Name: Bob; Age: 25

Сравнение объектов

При сравнении объектов классов следует принимать во внимание ряд особенностей. В частности, при использовании оператора равенства == два объекта считаются равными, если они представляют один и тот же класс и их свойства имеют одинаковые значения.

А при использовании оператора эквивалентности === оба объекта считаются равными, если обе переменных классах указывают на один и тот же экземпляр класса.

name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> age = 36; $tomas = new Person(); $tomas -> name = "Tom"; $tomas -> age = 36; if($tom == $tomas) echo "переменные tom и tomas равны
"; else echo "переменные tom и tomas НЕ равны
"; if($tom === $tomas) echo "переменные tom и tomas эквивалентны"; else echo "переменные tom и tomas НЕ эквивалентны"; ?>

Здесь сравниваются две переменных — $tom и $tomas. Они представляют один и тот же класс Person, и их свойства имеют одни и те же значения. Однако они представляют разные объекты. Поэтому при сравнении оператор == возвратит true , а оператор === — false :

переменные tom и tomas равны переменные tom и tomas НЕ эквивалентны

Возьмем другой пример, когда обе переменных представляют один и тот же объект:

$person = new Person(); $tom = $person; $tom -> name = "Tom"; $tom -> age = 36; $tomas = $person; if($tom == $tomas) echo "переменные tom и tomas равны
"; else echo "переменные tom и tomas НЕ равны
"; if($tom === $tomas) echo "переменные tom и tomas эквивалентны"; else echo "переменные tom и tomas НЕ эквивалентны";

Здесь объект класса Person создается только один раз: $person = new Person(); . И затем обе переменных $tom и $tomas будут указывать на этот объект. При этом не имеет значения, для какой именно переменной мы устанавливаем свойства. Так как в реальности это будет один и тот же объект. В итоге и оператор == , и оператор === при сравнении возвратят true

переменные tom и tomas равны переменные tom и tomas эквивалентны

Источник

Читайте также:  Even and odd numbers php

Обращение к методам класса через $this

Через $this можно обращаться не только к свойствам объекта, но и к его методам. Посмотрим на примере. Пусть у нас есть класс User , а в нем метод setAge для изменения возраста юзера:

Давайте добавим проверку введенного возраста: если он от 18 до 60 , то будем менять возраст на новый, а если нет — то менять не будем:

Пусть также нам нужен метод addAge , который будет добавлять некоторое количество лет к текущему возрасту:

В метод addAge , конечно же, также необходимо добавить проверку возраста, сделаем это:

= 18 and $age age = $age; > > // Метод для добавления к возрасту: public function addAge($years) < $newAge = $this->age + $years; // вычислим новый возраст // Если НОВЫЙ возраст от 18 до 60: if ($newAge >= 18 and $newAge age = $newAge; // обновим, если новый возраст прошел проверку > > > ?>

Получится, что ограничения на возраст теперь задаются в двух местах (в методе setAge и в методе addAge ), что не очень хорошо: если мы захотим поменять ограничение, нам придется сделать это в двух местах — это неудобно, и в каком-то из мест мы можем забыть внести изменения — это опасно, ведь наш код получится с трудноуловимой ошибкой.

Давайте вынесем проверку возраста на корректность в отдельный вспомогательный метод isAgeCorrect , в который параметром будет передаваться возраст для проверки, и используем его внутри методов setAge и addAge :

= 18 and $age else < return false; >> // Метод для изменения возраста юзера: public function setAge($age) < // Проверим возраст на корректность: if ($this->isAgeCorrect($age)) < $this->age = $age; > > // Метод для добавления к возрасту: public function addAge($years) < $newAge = $this->age + $years; // вычислим новый возраст // Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) < $this->age = $newAge; // обновим, если новый возраст прошел проверку > > > ?>

Теперь любое изменения в условиях проверки можно будет легко сделать в одном месте. Проверим, что все работает как надо:

setAge(30); // установим возраст в 30 echo $user->age; // выведет 30 $user->setAge(10); // установим некорректный возраст echo $user->age; // не выведет 10, а выведет 30 ?>

Не подсматривая в мой код создайте такой же класс User с такими же методами.

Создайте объект этого класса User проверьте работу методов setAge и addAge .

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

Источник

PHP $this

Summary: in this tutorial, you will learn about PHP $this keyword and how to use $this inside a class to reference the current object.

Читайте также:  Js получение css свойства элемента

What is $this in PHP?

In PHP, $this keyword references the current object of the class. The $this keyword allows you to access the properties and methods of the current object within the class using the object operator ( -> ):

$this->property $this->method()Code language: PHP (php)

The $this keyword is only available within a class. It doesn’t exist outside of the class. If you attempt to use the $this outside of a class, you’ll get an error.

When you access an object property using the $this keyword, you use the $ with the this keyword only. And you don’t use the $ with the property name. For example:

$this->balanceCode language: PHP (php)

The following shows the BankAccount class:

 class BankAccount < public $accountNumber; public $balance; public function deposit($amount) < if ($amount > 0) < $this->balance += $amount; > > public function withdraw($amount) < if ($amount $this->balance) < $this->balance -= $amount; return true; > return false; > >Code language: PHP (php)

In this example, we access the balance property via the $this keyword inside the deposit() and withdraw() methods.

Chaining methods

First, create a new BankAccount object:

// create a new account object $account = new BankAccount(); $account->accountNumber = 1; $account->balance = 100;Code language: PHP (php)

Second, call the deposit() method three times to deposit different amounts of money:

$account->deposit(100); $account->deposit(200); $account->deposit(300);Code language: PHP (php)

This code is quite verbose. It would be more concise and expressive if you can write these statements using a single statement like this:

$account->deposit(100) ->deposit(200) ->deposit(300);Code language: PHP (php)

This technique is called method chaining.

To form the chain, the deposit() method needs to return a BankAccount object, which is the $this inside the BankAccount class like this:

 class BankAccount < public $accountNumber; public $balance; public function deposit($amount) < if ($amount > 0) < $this->balance += $amount; > return $this; > public function withdraw($amount) < if ($amount $this->balance) < $this->balance -= $amount; return true; > return false; > >Code language: PHP (php)

The deposit() returns the $this which is the current object of the BankAccount class. Therefore, you can call any public method of the BankAccount class.

The following example calls the deposit() method first and then the withdraw() method in a single statement:

$account->deposit(100) ->withdraw(150);Code language: PHP (php)

It’s equivalent to the following:

$account->deposit(100); $account->withdraw(150);Code language: PHP (php)

Summary

  • PHP $this keyword references the current object of the class. It’s only available within the class.
  • Do use the method chaining by returning $this from a method to make the code more concise.

Источник

Оцените статью