Объекты и классы
При создании программы на PHP и отдельных ее блоков нам вполне может хватить той функциональности, которую представляют функции. Однако PHP имеет и другие возможности по созданию программ, которые представляет объектно-ориентированное программирование. В ряде случаев программы, использующие ООП, проще в понимании, их легче поддерживать и изменять.
Ключевыми понятиями парадигмы ООП являются понятия класс
и объект
. Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека - этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является
объектом или экземпляром этого класса.
Для создания класса в PHP используется ключевое слово class
, после которого идет название класса и фигурные скобки {}
блок кода класса. Например, новый класс, представляющий пользователя:
class Person {
}
Чтобы создать объект класса Person
, применяется ключевое слово new
:
<?
class Person {
}
$person = new Person();
print_r($person);
В данном случае переменная $person
является объектом класса Person
. С помощью функции print_r()
можно вывести содержимое объекта, как и в случае с массивами.
При этом неважно, определяется класс до или после создания объекта. Например, мы можем сначала определить переменную класса, а потом определить этот класс:
<?
$person = new Person();
class Person {
}
Свойства и методы
Класс может содержать переменные, которые описывают какие-то признаки объекта, его состояние и которые еще назывют свойствами или атрибутам. И также класс может содержать функции, которые еще назвают методами и которые определяют его поведение.
Так, добавим в класс Person
несколько свойств и методов:
<?
class Person {
public $name, $age;
function hello() {
echo "Hello!<br>";
}
}
$tom = new Person();
$tom->name = "Tom"; // установка свойства $name
$tom->age = 36; // установка свойства $age
$personName = $tom->name; // получение значения свойства $name
echo "Имя пользователя: " . $personName . "<br>";
$tom->hello(); // вызов метода hello()
print_r($tom);
Здесь класс Person
содержит два свойства: $name
и $age
. Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа - в данном случае модификатор public
.
Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция hello()
просто выводит приветствие.
После создания объекта класса Person
:
$tom = new Person();
Мы можем через имя переменной класса обращаться к его свойствам и методам. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа ->
. Например, установить значения свойств:
$tom->name = "Tom"; // установка свойства $name
$tom->age = 36; // установка свойства $age
Или получить значение (например, присвоить его переменной):
$personName = $tom->name; // получение значения свойства $name
Или вызвать методы объекта:
$tom->hello(); // вызов метода hello()
В итоге мы получим следующий вывод браузера:
Имя пользователя: Tom
Hello!
Person Object ( [name] => Tom [age] => 36 )
При этом свойствам можно задать в классе некоторые начальные значения:
<?
class Person {
public $name = "Undefined", $age = 18;
function hello() {
echo "Hello!<br>";
}
}
$tom = new Person();
$tom->age = 36; // установка свойства $age
echo "Имя пользователя: " . $tom->name . "<br>";
echo "Возраст пользователя: " . $tom->age . "<br>";
Вывод брузера:
Имя пользователя: Undefined
Возраст пользователя: 36
Ключевое слово this
Для обращения к свойствам и методам объекта внутри его класса применяется ключевое слово this
. Например, определим в классе метод для вывода информации об объекте:
<?
class Person {
public $name = "Undefined", $age = 18;
function displayInfo() {
echo "Name: " . $this->name ."; Age: " . $this->age . "<br>";
// также можно написать
// echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> displayInfo(); // Name: Tom; Age: 18
Для обращения к полям и методам внутри класса также применяется оператор доступа ->
, перед которым идет $this
. Причем это $this
указывает именно на текущий объект. Что это значит в практическом плане:
<?
class Person {
public $name = "Undefined", $age = 18;
function displayInfo() {
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> displayInfo();
$bob = new Person();
$bob -> name = "Bob";
$bob -> age = 25;
$bob -> displayInfo();
При вызове:
$tom -> displayInfo();
$this
фактически будет указывать на переменную $tom
. Тогда как при вызове:
$bob -> displayInfo();
$this
будет указывать на переменную $bob
. Вывод браузера:
Name: Tom; Age: 18
Name: Bob; Age: 25
Сравнение объектов
При сравнении объектов классов следует принимать во внимание ряд особенностей. В частности, при использовании оператора равенства ==
два объекта считаются равными, если они представляют один и тот же класс и их свойства имеют одинаковые значения.
А при использовании оператора эквивалентности ===
оба объекта считаются равными, если обе переменных классах указывают на один и тот же экземпляр класса. Рассмотрим на примере:
<?
class Person {
public $name, $age;
function displayInfo() {
echo "Name: $this->name; Age: $this->age<br>";
}
}
$tom = new Person();
$tom -> name = "Tom";
$tom -> age = 36;
$tomas = new Person();
$tomas -> name = "Tom";
$tomas -> age = 36;
if($tom == $tomas) echo "переменные tom и tomas равны<br>";
else echo "переменные tom и tomas НЕ равны<br>";
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 равны<br>";
else echo "переменные tom и tomas НЕ равны<br>";
if($tom === $tomas) echo "переменные tom и tomas эквивалентны";
else echo "переменные tom и tomas НЕ эквивалентны";
Здесь объект класса Person создается только один раз: $person = new Person();
. И затем обе переменных $tom
и $tomas
будут указывать на этот объект. При этом не имеет значения, для какой именно переменной мы устанавливаем свойства. Так как в реальности это будет один и тот же объект. В итоге и оператор ==
, и оператор ===
при сравнении возвратят true
переменные tom и tomas равны
переменные tom и tomas эквивалентны