Активный
- Тема Автор
- #1
Объектно-ориентированное программирование упрощает разработку. Разберем основы ООП в PHP.
Создание класса
Модификаторы доступа:
- public - доступно везде
- private - доступно только внутри класса
- protected - доступно в классе и наследниках
Наследование
Инкапсуляция
Статические методы и свойства
Абстрактные классы
Интерфейсы
Магические методы
Трейты (Traits)
Важные моменты:
- Используйте инкапсуляцию для защиты данных
- Применяйте наследование для переиспользования кода
- Используйте интерфейсы для определения контрактов
- Применяйте абстрактные классы для общих реализаций
ООП делает код более организованным и поддерживаемым!
Создание класса
Код:
<?php
class User {
// Свойства
public $name;
public $email;
private $password;
// Конструктор
public function __construct($name, $email, $password) {
$this->name = $name;
$this->email = $email;
$this->password = $password;
}
// Методы
public function getName() {
return $this->name;
}
public function getEmail() {
return $this->email;
}
private function hashPassword($password) {
return password_hash($password, PASSWORD_DEFAULT);
}
}
// Создание объекта
$user = new User("John", "john@example.com", "password123");
echo $user->getName(); // John
?>
Модификаторы доступа:
- public - доступно везде
- private - доступно только внутри класса
- protected - доступно в классе и наследниках
Наследование
Код:
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "Животное издает звук";
}
}
class Dog extends Animal {
public function speak() {
return $this->name . " лает: Гав-гав!";
}
}
class Cat extends Animal {
public function speak() {
return $this->name . " мяукает: Мяу!";
}
}
$dog = new Dog("Бобик");
echo $dog->speak(); // Бобик лает: Гав-гав!
$cat = new Cat("Мурзик");
echo $cat->speak(); // Мурзик мяукает: Мяу!
?>
Инкапсуляция
Код:
<?php
class BankAccount {
private $balance = 0;
public function deposit($amount) {
if($amount > 0) {
$this->balance += $amount;
return true;
}
return false;
}
public function withdraw($amount) {
if($amount > 0 && $amount <= $this->balance) {
$this->balance -= $amount;
return true;
}
return false;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(1000);
$account->withdraw(500);
echo $account->getBalance(); // 500
?>
Статические методы и свойства
Код:
<?php
class Math {
public static function add($a, $b) {
return $a + $b;
}
public static function multiply($a, $b) {
return $a * $b;
}
public static $pi = 3.14159;
}
// Вызов статических методов
echo Math::add(5, 3); // 8
echo Math::multiply(4, 2); // 8
echo Math::$pi; // 3.14159
?>
Абстрактные классы
Код:
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function getArea();
abstract public function getPerimeter();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function getArea() {
return $this->width * $this->height;
}
public function getPerimeter() {
return 2 * ($this->width + $this->height);
}
}
class Circle extends Shape {
private $radius;
public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
}
public function getArea() {
return pi() * $this->radius * $this->radius;
}
public function getPerimeter() {
return 2 * pi() * $this->radius;
}
}
$rectangle = new Rectangle("red", 5, 10);
echo $rectangle->getArea(); // 50
$circle = new Circle("blue", 5);
echo $circle->getArea(); // ~78.54
?>
Интерфейсы
Код:
<?php
interface Logger {
public function log($message);
}
interface Database {
public function connect();
public function query($sql);
}
class FileLogger implements Logger {
public function log($message) {
file_put_contents("log.txt", $message . "\n", FILE_APPEND);
}
}
class DatabaseLogger implements Logger, Database {
private $conn;
public function connect() {
$this->conn = new mysqli("localhost", "root", "", "database");
}
public function query($sql) {
return $this->conn->query($sql);
}
public function log($message) {
$this->query("INSERT INTO logs (message) VALUES ('$message')");
}
}
$logger = new FileLogger();
$logger->log("Сообщение");
?>
Магические методы
Код:
<?php
class Magic {
private $data = [];
// Вызывается при обращении к несуществующему свойству
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : null;
}
// Вызывается при установке несуществующего свойства
public function __set($name, $value) {
$this->data[$name] = $value;
}
// Вызывается при вызове несуществующего метода
public function __call($name, $arguments) {
echo "Вызван метод: $name с аргументами: " . implode(", ", $arguments);
}
// Вызывается при преобразовании в строку
public function __toString() {
return "Объект Magic";
}
// Вызывается при уничтожении объекта
public function __destruct() {
echo "Объект уничтожен";
}
}
$magic = new Magic();
$magic->name = "John"; // __set
echo $magic->name; // John (__get)
$magic->unknownMethod("arg1", "arg2"); // __call
echo $magic; // Объект Magic (__toString)
?>
Трейты (Traits)
Код:
<?php
trait Loggable {
public function log($message) {
echo "Лог: $message";
}
}
trait Timestampable {
public function getTimestamp() {
return date("Y-m-d H:i:s");
}
}
class User {
use Loggable, Timestampable;
private $name;
public function __construct($name) {
$this->name = $name;
$this->log("Создан пользователь: $name");
}
}
$user = new User("John");
$user->log("Действие пользователя");
echo $user->getTimestamp();
?>
Важные моменты:
- Используйте инкапсуляцию для защиты данных
- Применяйте наследование для переиспользования кода
- Используйте интерфейсы для определения контрактов
- Применяйте абстрактные классы для общих реализаций
ООП делает код более организованным и поддерживаемым!