Sobes.tech
Middle

Кадом усулҳои ҷодугарӣ дар PHP вуҷуд доранд ва чӣ гуна истифода мешаванд?

sobes.tech AI

Ҷавоб аз AI

Магічні методи у PHP — це спеціальні методи, що починаються з подвійного підкреслення (наприклад, __construct), які автоматично викликаються у певних ситуаціях.

Основні магічні методи та їх використання:

  • __construct(): Викликається при створенні об'єкта класу. Використовується для ініціалізації властивостей об'єкта та виконання початкових дій.

    <?php
    class MyClass {
        public function __construct() {
            echo "Об'єкт створено!";
        }
    }
    $obj = new MyClass(); // Виведе "Об'єкт створено!"
    
  • __destruct(): Викликається при знищенні об'єкта (наприклад, коли скрипт завершується або об'єкт видаляється з пам'яті). Використовується для звільнення ресурсів (закриття файлів, з'єднань з базами даних).

    <?php
    class MyClass {
        public function __destruct() {
            echo "Об'єкт знищено!";
        }
    }
    $obj = new MyClass();
    unset($obj); // Виведе "Об'єкт знищено!"
    
  • __call(string $name, array $arguments): Викликається при спробі викликати недоступний або неіснуючий метод у контексті об'єкта. $name містить ім'я методу, а $arguments — масив аргументів.

    <?php
    class MyClass {
        public function __call($name, $arguments) {
            echo "Викликано недоступний метод '{$name}' з аргументами: " . implode(', ', $arguments);
        }
    }
    $obj = new MyClass();
    $obj->nonExistentMethod('arg1', 'arg2'); // Виведе "Викликано недоступний метод 'nonExistentMethod' з аргументами: arg1, arg2"
    
  • __callStatic(string $name, array $arguments): Викликається при спробі викликати недоступний або неіснуючий статичний метод у контексті класу. Аналогічний __call, але для статичних викликів.

    <?php
    class MyClass {
        public static function __callStatic($name, $arguments) {
            echo "Викликано недоступний статичний метод '{$name}' з аргументами: " . implode(', ', $arguments);
        }
    }
    MyClass::nonExistentStaticMethod('static_arg'); // Виведе "Викликано недоступний статичний метод 'nonExistentStaticMethod' з аргументами: static_arg"
    
  • __get(string $name): Викликається при спробі отримати значення недоступного або неіснуючого властивості у контексті об'єкта. $name містить ім'я властивості.

    <?php
    class MyClass {
        private $data = ['key' => 'value'];
        public function __get($name) {
            if (array_key_exists($name, $this->data)) {
                return $this->data[$name];
            }
            return null;
        }
    }
    $obj = new MyClass();
    echo $obj->key; // Виведе "value"
    echo $obj->nonExistentKey; // Виведе порожній рядок (залежно від поверненої null)
    
  • __set(string $name, mixed $value): Викликається при спробі встановити значення недоступного або неіснуючого властивості у контексті об'єкта. $name містить ім'я властивості, а $value — встановлюване значення.

    <?php
    class MyClass {
        private $data = [];
        public function __set($name, $value) {
            $this->data[$name] = $value;
        }
        public function getData() {
            return $this->data;
        }
    }
    $obj = new MyClass();
    $obj->newKey = 'newValue';
    print_r($obj->getData()); // Виведе Array ( [newKey] => newValue )
    
  • __isset(string $name): Викликається при виклику isset() або empty() на недоступному або неіснуючому властивості у контексті об'єкта. Повертає булеве значення.

    <?php
    class MyClass {
        private $data = ['present' => 'value'];
        public function __isset($name) {
            return array_key_exists($name, $this->data);
        }
    }
    $obj = new MyClass();
    var_dump(isset($obj->present));     // Виведе bool(true)
    var_dump(isset($obj->absent));      // Виведе bool(false)
    
  • __unset(string $name): Викликається при виклику unset() на недоступному або неіснуючому властивості у контексті об'єкта.

    <?php
    class MyClass {
        private $data = ['remove_me' => 'value_to_remove'];
        public function __unset($name) {
            if (array_key_exists($name, $this->data)) {
                unset($this->data[$name]);
                echo "Властивість '{$name}' видалено.\n";
            }
        }
        public function getData() {
            return $this->data;
        }
    }
    $obj = new MyClass();
    print_r($obj->getData());
    unset($obj->remove_me); // Виведе "Властивість 'remove_me' видалено." і видалить елемент з $data
    print_r($obj->getData());
    
  • __sleep(): Викликається перед серіалізацією об'єкта за допомогою serialize(). Має повернути масив імен властивостей, які потрібно серіалізувати.

    <?php
    class MyClass {
        public $prop1 = 'value1';
        public $prop2 = 'value2';
        public function __sleep() {
            return ['prop1']; // Серіалізуємо лише prop1
        }
    }
    $obj = new MyClass();
    $serialized = serialize($obj); // Серіалізує лише prop1
    echo $serialized; // Виведе приблизно O:7: