Объектно-ориентированное программирование
При создании программы на PHP и отдельных ее блоков нам вполне может хватить той функциональности, которую представляют функции. Однако PHP имеет и другие возможности по созданию программ, которые представляет объектно-ориентированное программирование. В ряде случаев программы, использующие ООП, проще в понимании, их легче поддерживать и изменять.
Ключевыми понятиями парадигмы ООП являются понятия «класс» и «объект». Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека — этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является объектом или экземпляром этого класса.
Для создания класса в PHP используется ключевое слово class , после которого идет название класса и фигурные скобки <> — блок кода класса. Например, новый класс, представляющий пользователя:
class Person <>
Чтобы создать объект класса 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 = 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 )
При этом свойствам можно задать в классе некоторые начальные значения:
"; > > $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(); ?>
$tom -> displayInfo();
$this фактически будет указывать на переменную $tom . Тогда как при вызове
$bob -> displayInfo();
$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 эквивалентны
Статические классы
Поскольку для одного класса можно создать несколько экземпляров, это означает, что содержащиеся в нем значения уникальны для каждого экземпляра/объекта, а не для класса в целом. Кроме того, вы не можете использовать методы или переменные класса без создания объекта, но есть одно исключение из этого правила. Как переменные, так и методы класса могут быть объявлены статическими (static, в некоторых языках программирования их называют «shared» — «общими»), что означает, что их можно использовать без создания экземпляра. Так как это означает, что переменная класса становится доступной без конкретного объекта, будет создана единственная версия этой переменной. Еще одно следствие — статические методы не имеют доступа к нестатическим переменным и методам, которые привязаны к экземплярам.
В предыдущем параграфе мы написали класс User. Давайте расширим его с помощью статического функционала, чтобы понять, о чем речь:
name . " is " . $this->age . " years old"; > public static function ValidatePassword($password) < if(strlen($password) >= self::$minimumPasswordLength) return true; else return false; > > $password = "test"; if(User::ValidatePassword($password)) echo "Password is valid!"; else echo "Password is NOT valid!"; ?>
Мы добавили одну статическую переменную $minimumPasswordLength, заданную равной 6, а также статическую функцию, которая проверяет валидность переданного в нее пароля. Я признаю, что валидация здесь крайне ограничена, и очевидно, ее можно расширить. Так, а можно ли использовать обычную переменную и функцию класса? Конечно да, но сделать их статическими логичнее, ведь проверка не привязана к одному конкретному пользователю — это общая функциональность, нам не нужен экземпляр класса, чтобы ее использовать.
Как вы можете видеть, чтобы получить доступ к нашей статической переменной из статического метода, мы используем перед ней ключевое слово self (сам) — аналог this для статических членов и констант. Очевидно, self доступен только внутри класса. Вы также заметите, что для доступа к статическим членам используется двойное двоеточие, а не оператор ->, но в остальном они почти не отличаются.
This article has been fully translated into the following languages:
Is your preferred language not on the list? Click here to help us translate this article into your language!
Как подключить класс компонента в другом месте проекта
Начиная с версии доступна возможность описывать компонент через ооп подход в файле class.php.
Например вы создали свой класс CustomNews унаследованный от CBitrixComponent .
Возникла необходимость использовать класс, его поля, функции в другом месте проекта, вне самого компонента.
Для этих целей можно воспользоваться методом :
CBitrixComponent::includeComponentClass("vendor:custom_news");
Где vendor ваше пространство имен, а custom_news название компонента.
PHP OOP — Classes and Objects
A class is a template for objects, and an object is an instance of class.
OOP Case
Let’s assume we have a class named Fruit. A Fruit can have properties like name, color, weight, etc. We can define variables like $name, $color, and $weight to hold the values of these properties.
When the individual objects (apple, banana, etc.) are created, they inherit all the properties and behaviors from the class, but each object will have different values for the properties.
Define a Class
A class is defined by using the class keyword, followed by the name of the class and a pair of curly braces (<>). All its properties and methods go inside the braces:
Syntax
class Fruit // code goes here.
>
?>?php
Below we declare a class named Fruit consisting of two properties ($name and $color) and two methods set_name() and get_name() for setting and getting the $name property:
class Fruit // Properties
public $name;
public $color;
?php
// Methods
function set_name($name) $this->name = $name;
>
function get_name() return $this->name;
>
>
?>
Note: In a class, variables are called properties and functions are called methods!
Define Objects
Classes are nothing without objects! We can create multiple objects from a class. Each object has all the properties and methods defined in the class, but they will have different property values.
Objects of a class are created using the new keyword.
In the example below, $apple and $banana are instances of the class Fruit:
Example
class Fruit // Properties
public $name;
public $color;
?php
// Methods
function set_name($name) $this->name = $name;
>
function get_name() return $this->name;
>
>
$apple = new Fruit();
$banana = new Fruit();
$apple->set_name(‘Apple’);
$banana->set_name(‘Banana’);
echo $apple->get_name();
echo «
«;
echo $banana->get_name();
?>
In the example below, we add two more methods to class Fruit, for setting and getting the $color property:
Example
class Fruit // Properties
public $name;
public $color;
?php
// Methods
function set_name($name) $this->name = $name;
>
function get_name() return $this->name;
>
function set_color($color) $this->color = $color;
>
function get_color() return $this->color;
>
>
$apple = new Fruit();
$apple->set_name(‘Apple’);
$apple->set_color(‘Red’);
echo «Name: » . $apple->get_name();
echo «
«;
echo «Color: » . $apple->get_color();
?>
PHP — The $this Keyword
The $this keyword refers to the current object, and is only available inside methods.
Look at the following example:
Example
class Fruit public $name;
>
$apple = new Fruit();
?>?php
So, where can we change the value of the $name property? There are two ways:
1. Inside the class (by adding a set_name() method and use $this):
Example
class Fruit public $name;
function set_name($name) $this->name = $name;
>
>
$apple = new Fruit();
$apple->set_name(«Apple»);
?php
2. Outside the class (by directly changing the property value):
Example
class Fruit public $name;
>
$apple = new Fruit();
$apple->name = «Apple»;
?php
PHP — instanceof
You can use the instanceof keyword to check if an object belongs to a specific class: