English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как пишется код на языке PHP с использованием ориентации на объекты.
Ориентированное на объекты программирование (OOP) — это модель программирования, основанная на концепциях классов и объектов. В отличие от процедурного программирования, где акцент делается на написании процессов или функций, выполняющих операции с данными, в ориентированном на объекты программировании акцент делается на создание объектов, которые включают в себя и данные, и функции.
Ориентированное на объекты программирование (OOP) имеет множество преимуществ по сравнению с обычным или процедурным программированием. Самые важные из них перечислены ниже:
Это предоставляет программам четкую структуру модулей.
Это помогает вам следовать принципу «Не повторяйте себя» (DRY), что делает ваш код более легким для поддержания, изменения и отладки.
Это позволяет создавать более сложное поведение с помощью меньшего количества кода, более короткого времени разработки и высокой повторяемости.
Следующие разделы будут описывать, как классы и объекты работают в PHP.
Совет:Программа, написанная стилем процедурного программирования, означает, что программа состоит из одного или нескольких процессов. Процесс — это набор программных инструкций, выполняемых вместе для выполнения специфической задачи.
Совет:Мысль, лежащая в основе принципа «Не повторяйся» (Don’t Repeat Yourself, DRY), заключается в том, чтобы уменьшить повторение кода,抽象изируя часто используемый код в приложении и используя его повторно в одном месте, а не повторяя.
Класс и объект — это два основных аспекта объектно-ориентированного программирования. Класс — это независимый набор переменных и функций, которые работают вместе для выполнения одной или нескольких специфических задач, а объект — это единичный экземпляр класса.
Класс действует как шаблон или план, из которого можно создать множество отдельных объектов. При создании отдельного объекта, хотя некоторые свойства каждого объекта могут иметь разные значения, они наследуют общие свойства и поведение.
Например, представьте, что класс — это план дома. Сам план не является домом, а подробный план дома. А объекты — это реальные дома, построенные по этому плану. Мы можем построить несколько домов по одному и тому же плану, но каждый из домов может иметь разные краски, отделку и семью, как показано на следующем рисунке.
Класс можно объявить с помощью ключевого слова class, за которым следует имя класса и пара фигурных скобок ({ }), как показано в следующем примере.
Давайте создадим PHP-файл с именем Recangle.php и поместим в него следующий пример код, чтобы отделить наш класс от остальной части программы. Затем мы можем включить файл Recangle.php, чтобы использовать его в любом месте, где это необходимо.
<?php class Rectangle { //декларация свойств public $length = 0; public $width = 0; // Метод для вычисления периметра public function getPerimeter() { return (2 * ($this->length + $this->width)); } // Метод для вычисления площади public function getArea() { return ($this->length * $this->width); } } ?>
Ключевое слово public перед свойствами и методами в примере выше — этоДоступ к свойствамозначает, что это свойство или метод может быть доступен из любого места. Мы узнаем больше о этом稍 позже в этой главе.
Внимание:С точки зрения синтаксиса, переменные в классе называются свойствами, а функции — методами. Кроме того, имя класса обычно пишется по методу PascalCase (Паскальское написание), то есть каждый соединенный слово начинается с большой буквы (например, MyClass).
Создайте другой PHP-файл с именем test.php и поместите в него следующий код.
<?php // Содержит определение класса class Rectangle { //декларация свойств public $length = 0; public $width = 0; // Метод для вычисления периметра public function getPerimeter() { return (2 * ($this->length + $this->width)); } // Метод для вычисления площади public function getArea() { return ($this->length * $this->width); } } // Создание нового объекта из класса Rectangle $obj = new Rectangle; // Получение значения свойства объекта echo $obj->length; // Вывод: 0 echo $obj->width; // Вывод: 0 // Установка значения свойства объекта $obj->length = 30; $obj->width = 20; // Повторное чтение значений свойств объекта для отображения изменений echo $obj->length; // Вывод: 30 echo "<br>"; echo $obj->width; // Вывод: 20 // Вызов методов объекта echo $obj->getPerimeter(); // Вывод: 100 echo "<br>"; echo $obj->getArea(); // Вывод: 600 ?>Проверьте, посмотрите <</>
Стрелка (->) - это конструкция OOP, используемая для доступа к включенным в объект свойствам и методам. Псевдопеременная $this предоставляет ссылку на объект, вызов которого (т.е. объект, к которому относится метод).
Когда используется несколько экземпляров одного и того же класса, истинная сила объектно-ориентированного программирования становится очевидной, как показано в следующем примере:
<?php // Содержит определение класса class Rectangle { //декларация свойств public $length = 0; public $width = 0; // Метод для вычисления периметра public function getPerimeter() { return (2 * ($this->length + $this->width)); } // Метод для вычисления площади public function getArea() { return ($this->length * $this->width); } } // Создание нескольких объектов из класса Rectangle $obj1 = new Rectangle; $obj2 = new Rectangle; // Вызов методов двух объектов echo $obj1->getArea(); // Вывод: 0 echo $obj2->getArea(); // Вывод: 0 // Установка значений свойств $obj1 $obj1->length = 30; $obj1->width = 20; // Установка значений свойств $obj2 $obj2->length = 35; $obj2->width = 50; // Повторное вызов методов двух объектов echo $obj1->getArea(); // Вывод: 600 echo "<br>"; echo $obj2->getArea(); // Вывод: 1750 ?>Проверьте, посмотрите <</>
Как показано в предыдущем примере, вызов метода getArea() на различных объектах вызывает выполнение метода на различных наборах данных. Каждая инстанция объекта полностью независима, имеет свои свойства и методы, поэтому даже если они都属于 один и тот же класс, их можно обрабатывать независимо.
Для упрощения объектно-ориентированного программирования PHP предоставляет некоторые магические методы, которые автоматически вызываются при выполнении某些 операций с объектом.
Например, каждый раз при создании нового объекта автоматически вызывается магический метод __construct() (называемый конструктором). Точно так же магический метод __destruct() (называемый деструктором) автоматически вызывается при уничтожении объекта. После уничтожения объекта деструктор очищает все ресурсы, выделенные этому объекту.
<?php class MyClass { //конструктор public function __construct(){ echo ' класс "' . __CLASS__ . '" уже запущен<br>; } // Деструктор public function __destruct() { echo 'Класс "' . __CLASS__ . '" был уничтожен<br>'; } } // Создание нового объекта $obj = new MyClass; // Вывод сообщения в конце файла echo "Достигнут конец файла."; ?>Проверьте, посмотрите <</>
PHP-код в примере выше будет генерировать следующий вывод:
Класс "MyClass" был запущен Достигнут конец файла. Класс "MyClass" был уничтожен
В конце скрипта автоматически вызывается деструктор. Однако, чтобы явно инициировать деструктор, можно использовать функцию PHP unset() для уничтожения объекта, как показано ниже:
<?php class MyClass { //конструктор public function __construct(){ echo ' класс "' . __CLASS__ . '" уже запущен<br>; } // Деструктор public function __destruct() { echo 'Класс "' . __CLASS__ . '" был уничтожен<br>'; } } // Создание нового объекта $obj = new MyClass; // Уничтожение объекта unset($obj); // Вывод сообщения в конце файла echo "Достигнут конец файла."; ?>Проверьте, посмотрите <</>
Теперь, PHP-код в приведенном выше примере будет генерировать следующий вывод:
Класс "MyClass" был запущен Класс "MyClass" был уничтожен Достигнут конец файла.
Совет:После завершения выполнения скрипта PHP автоматически очищает все ресурсы, выделенные в процессе выполнения, такие как закрытие соединения с базой данных, уничтожение объектов и т.д.
Примечание:__CLASS__ являетсяМагические константы,включая имя класса, из которого он происходит. Если это происходит вне класса, то оно пусто.
Класс может использовать ключевое слово extends для наследования свойств и методов другого класса. Процесс расширения называется наследованием. Это может быть одной из самых сильных причин использования модели объектно-ориентированного программирования.
<?php // Содержит определение класса class Rectangle { //декларация свойств public $length = 0; public $width = 0; // Метод для вычисления периметра public function getPerimeter() { return (2 * ($this->length + $this->width)); } // Метод для вычисления площади public function getArea() { return ($this->length * $this->width); } } // Создание нового класса на основе существующего класса class Square extends Rectangle { // Метод для проверки, является ли прямоугольник также квадратом public function isSquare() { if ($this->length == $this->width) { return true; // Квадрат else { return false; // Не является квадратом } } } // Создание нового объекта из класса Square $obj = new Square; // Установка значений свойств объекта $obj->length = 20; $obj->width = 20; // Вызов метода объекта if ($obj->isSquare()) { echo "Площадь квадрата составляет"; else { echo "Площадь прямоугольника составляет"; }; echo $obj->getArea(); ?>Проверьте, посмотрите <</>
PHP-код в примере выше будет генерировать следующий вывод:
Площадь квадрата составляет 400
Как вы видите в примере выше, несмотря на то, что класс Square не содержит метод getArea() и свойства $length и $width явно, его экземпляры могут использовать их, потому что они наследуются от родительского класса Rectangle.
Совет:Поскольку подклассы происходят от базового класса, их также называют производными классами, а базовый класс называется базовым.
При использовании класса, вы даже можете использовать ключевые слова可见имости для ограничения доступа к свойствам и методам, чтобы обеспечить лучшее управление. Есть три ключевых слова可见имости (от наиболее видимых до наименее видимых): public, protected, private, они определяют, как и откуда можно доступа и изменять свойства и методы.
public - Свойства или методы могут быть доступны изнутри и снаружи класса в любом месте. Это по умолчанию для всех членов класса в PHP.
protected - Защищенные свойства или методы могут быть доступны только из самого класса, подклассов или наследующих классов (то есть классов, расширяющих этот класс).
private - Приватные свойства или методы могут быть доступны только из класса, в котором они определены. Даже подклассы или наследующие классы не могут доступа к приватным свойствам или методам.
Данный пример покажет, как это на самом деле работает:
<?php //Определение класса class Automobile { //декларация свойств public $fuel; protected $engine; private $transmission; } class Car extends Automobile { //конструктор public function __construct(){ echo ' класс "' . __CLASS__ . '" уже запущен<br>; } } //создание объекта из класса Automobile $automobile = new Automobile; //попытка установить свойства объекта $automobile $automobile->fuel = 'Petrol'; // ok $automobile->engine = '1500 cc'; // смертельная ошибка $automobile->transmission = 'Manual'; // смертельная ошибка //создание объекта из класса Car $car = new Car; //попытка установить свойства объекта $car $car->fuel = 'Diesel'; // ok $car->engine = '2200 cc'; // fatal error $car->transmission = 'Automatic'; // undefined ?>
Кроме видимости, свойства и методы также могут быть объявлены как static (статические), что позволяет к ним обращаться без экземпляра класса. Статические свойства и методы можно получить с помощью оператора диапазона (::), как показано следующим образом: ClassName::$property и ClassName::method().
Хотя можно использовать статические методы, но не через объект класса можно получить доступ к объявленным как статическим свойствам, как показано в следующем примере:
<?php //Определение класса class HelloClass { //Декларация статического свойства public static $greeting = "Hello World!"; //Декларация статического метода public static function sayHello(){ echo self::$greeting; } } //Попытка прямого доступа к статическим свойствам и методам echo HelloClass::$greeting; //Вывод: Hello World! HelloClass::sayHello(); //Вывод: Hello World! //Попытка доступа к статическим свойствам и методам через объект $hello = new HelloClass; echo $hello->greeting; // Strict Warning $hello->sayHello(); //Вывод: Hello World! ?>
В предыдущем примере ключевое слово self означает «текущий класс». Оно никогда не начинается с символа доллара ($) и всегда начинается с оператора :: (например, self::$name).
Ключевое слово self отличается от ключевого слова this, оно означает «текущий объект» или «текущую инстанцию класса». Это ключевое слово всегда начинается с символа доллара ($), за которым следует оператор -> (например, $this->name).
Внимание:Поскольку статические методы могут быть вызываемы без экземпляра класса (т.е. объекта), переменная-псевдоним $this недоступна в методах, объявленных как static.
Мы надеемся, что вы уже знаете основные концепции объектно-ориентированного программирования. Вы найдете больше примеров ООП в разделах PHP и MySQL.