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 указать какое-либо другое значение по умолчанию, будет выдана ошибка.

    
Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011-2016 © puzzleweb.ru

Реклама на сайте | Обратная связь