Основы ООП в PHP: классы и объекты

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Объектно-ориентированное программирование упрощает разработку. Разберем основы ООП в PHP.

Создание класса
Код:
<?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();
?>

Важные моменты:
- Используйте инкапсуляцию для защиты данных
- Применяйте наследование для переиспользования кода
- Используйте интерфейсы для определения контрактов
- Применяйте абстрактные классы для общих реализаций

ООП делает код более организованным и поддерживаемым!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху