PHP: Классы и объекты
- Определение класса
- Создание объекта
- Определение свойств
- Работа с методами
- Специальный метод - конструктор
- Указание типа аргумента в методах
Поскольку именно классы описывают объекты, мы начнем описание с определения классов.
Определение класса
Класс - это шаблон кода, который используется для создания объектов. Класс определяется с помощью ключевого слова class после которого указывается произвольное имя класса. В имени класса может использоваться любое сочетание букв и цифр, но они не должны начинаться с цифры. Код, связанный с классом должен быть заключен в фигурные скобки, которые указываются после имени. Определение класса описывает, какие элементы будут содержаться в каждом новом экземпляре этого класса. На основе полученных данных давайте посмотрим синтаксис определения класса на примере:
<?php class first { // Тело класса } ?>
Класс first
из приведенного примера - уже полноправный класс, хотя пока и не слишком полезный. Но тем не менее мы сделали нечто очень важное. Мы определили тип, т.е. создали категорию данных, которые мы можем использовать в своих сценариях. Важность этого станет для вас очевидной по мере дальнейшего чтения главы.
Создание объекта
Так как класс - это шаблон для создания объектов, следовательно, объект - это данные, которые создаются и структурируются в соответствии с шаблоном, определенным в классе. Объект также называют экземпляром класса, тип которого определяется классом. Для создания нового экземпляра класса нам понадобится оператор new. Он используется совместно с именем класса следующим образом:
<?php // Ключевое слово new сообщает интерпретатору PHP о необходимости // создать новый экземпляр класса first $obj1 = new first(); $obj2 = new first(); ?>
После оператора new
указывается имя класса на основе которого будет создан объект. Оператор new
создает экземпляр класса и возвращает ссылку на вновь созданный объект. Эта ссылка сохраняется в переменной соответствующего типа. В результате выполнения этого кода будет создано два объект типа first
. Хотя функционально они идентичны (т.е. пусты) $obj1
и $obj2
- это два разных объекта одного типа, созданных с помощью одного класса.
Если вам все еще не понятно, давайте приведем аналогию из реальной жизни. Представьте, что класс - это форма для отливки, с помощью которой изготавливаются пластмассовые машинки. Объекты - это и есть машинки. Тип создаваемых объектов определяется формой отливки. Машинки выглядят одинаковыми во всех отношениях, но все-таки это разные предметы. Другими словами, это разные экземпляры одного и того же типа.
Давайте сделаем эти объекты немного интереснее, изменив класс first
, добавив в него специальные поля данных, называемые свойства.
Определение свойств
В классе можно определить переменные. Переменные, которые определены в классе называются свойствами (или полями данных). Они определяются с одним из ключевых слов protected, public
или private
, характеризующих управление доступом. Эти ключевые слова мы рассмотрим подробно в следующей главе. А сейчас давайте определим некоторые свойства с помощью ключевого слова public
:
<?php class first { public $num = 0; public $str = 'some text'; } ?>
Как видите, мы определили два свойства, присвоив каждому из них значение. Теперь любые объекты, которые мы будем создавать с помощью класса first
, будут иметь два свойства с указанными значениями.
Примечание: значения инициализирующие свойства должны быть литералами (константными значениями), инициализировать свойства в классе не обязательно (если значение не указано, по умолчанию это будет NULL
).
К свойствам объекта можно обращаться с помощь символов '->
', указав объект и имя свойства. Поскольку свойства объектов были определены как public
, мы можем считывать их значения, а также присваивать им новые значения, заменяя тем самым начальные значения, определенные в классе:
<?php class first { public $num = 0; public $str = 'some text'; } $obj = new first(); echo $obj->str; // присваиваем свойству объекта новое значение $obj->str = 'новая строка'; echo "<br>$obj->str"; ?>
На самом деле в PHP необязательно объявлять все свойства в классе. Свойства можно добавлять к объекту динамически:
<?php class first { public $str = 'some text'; } $obj = new first(); // добавляем объекту новое свойство $obj->newprop = 'новое свойство'; echo $obj->newprop; ?>
Нужно отметить, что этот способ присваивания свойств объектам считается дурным тоном в объектно-ориентированном программировании и почти никогда не используется.
Работа с методами
Методы - это обычные функции, которые определяются внутри класса, они позволяют объектам выполнять различные задачи. Объявление метода напоминает определение обычной функции, за исключением предваряемого одного из ключевых слов protected, public
или private
. Если в определении метода вы опустите ключевое слово, определяющее видимость, то метод будет объявлен неявно как public
. К методам объекта можно обращаться с помощь символов '->
', указав объект и имя метода. При вызове метода, так же как и при вызове функции нужно использовать круглые скобки.
<?php class first { public $str = 'some text'; // определение метода function getstr() { echo $this->str; } } $obj = new first(); // вызов метода объекта $obj->getstr(); ?>
Мы добавили метод getstr()
к классу first
. Обратите внимание на то, что при определении метода мы не использовали ключевое слово, определяющее область видимости. Это означает, что метод getstr()
относится к типу public
и его можно вызвать за пределами класса.
В определении метода мы воспользовались специальной псевдопеременной $this. Она используется для обращения к методам или свойствам внутри класса и имеет следующий синтаксис:
$this->имя переменной или метода
Значением переменной $this
является ссылка на текущий объект. Чтобы стало понятнее посмотрите на следующий пример:
class first { public $str = 'some text'; // при определении метода в классе, переменная $this не имеет никакого значения function getstr() { echo $this->str; } } // создаем объект $obj = new first(); // созданный нами объект имеет свойство и метод // теперь в методе объекта переменная $this имеет // ссылку на текущий объект, а именно на $obj // т.е. если в методе заменить $this текущим экземпляром объекта $this->str; // это будет выглядеть как простое // обращение к свойству текущего объекта $obj->str;
Примечание: переменной $this
нельзя ничего присваивать. Помните, что переменная $this
всегда ссылается на текущий объект.
Специальный метод - конструктор
У класса может быть определен специальный метод - конструктор, который вызывается каждый раз при создании нового экземпляра класса (объекта) с целью инициализировать его, например установить значения свойств. Конструктор, как и любой другой метод может иметь параметры. Чтобы определить метод в качестве конструктора его необходимо назвать __construct()
. Обратите внимание на то, что имя метода должно начинаться с двух символов подчеркивания. Посмотрим, как это работает:
<?php class first { // определяем два свойства public $num1 = 0; public $num2 = 0; // определяем конструктор класса function __construct($num1, $num2) { $this->num1 = $num1; $this->num2 = $num2; } // метод, который складывает два числа function summa() { return $this->num1 + $this->num2; } } // создаем объект и передаем два аргумента $obj = new first(15, 35); // вызываем метод и сразу выводим результат его работы echo $obj->summa(); ?>
Метод __construct
вызывается, когда создается объект с помощью оператора new
. Указанные в скобках аргументы передаются конструктору. В методе конструктора используется псевдопеременная $this
для присвоения значений соответствующим свойствам создаваемого объекта.
()
после имени класса можно опустить:
$obj = new first;
Указание типа аргумента в методах
По умолчанию метод может принимать аргументы любого типа, но бывают случаи, когда необходимо сделать так, чтобы метод мог принимать в качестве аргумента только экземпляры определенного класса. Для указания типа принимаемого аргумента, просто поместите в определении метода перед именем параметра название класса:
<?php // определяем два пустых класса class cat {} class wrong {} class write { // метод, который принимает аргументы только типа cat function getobj(cat $getCat) { // определяем параметр типа cat echo 'Получен объект типа cat'; } } // создаем экземпляр типа write $kitty = new write(); // работает: передали в качестве аргумента экземпляр типа cat $kitty->getobj( new cat() ); // здесь будет ошибка: передали в качестве аргумента экземпляр типа wrong $kitty->getobj( new wrong() ); ?>
Теперь в качестве аргумента методу getobj()
можно передавать только экземпляры типа cat
. Поскольку метод getobj()
содержит уточнение типа класса, передача ему объекта типа wrong приведет к ошибке.
Указание типа нельзя использовать для определения параметров элементарных типов, таких как строки, числа и т.д. Для этой цели в теле метода следует использовать функции проверки типов, например is_string()
. Также есть возможность определить, что передаваемый аргумент является массивом:
<?php class write { $my_arr; // аргументом для метода может быть только массив function setArray(array $some_arr) { this->my_arr = $some_arr; } } ?>
И последнее о чем осталось сказать: если параметр метода определяется с указанием определенного класса, разрешается указать значение по умолчанию, на случай, если методу не было передано никакого объекта. В качестве значения по умолчанию может быть использовано только значение NULL
:
function getobj(cat $getCat = null) { $this->someVar = $getCat; }
Если вместо NULL
указать какое-либо другое значение по умолчанию, будет выдана ошибка.