Sobes.tech
Middle

Koje magične metode postoje u PHP-u i kako se koriste?

sobes.tech АИ

Одговор од АИ

Магичне методе у 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:"MyClass":1:{s:5:"prop1";s:6:"value1";}
    
  • __wakeup(): Позива се након десеријализације објекта коришћењем unserialize(). Користи се за обнову веза са базама података или других радњи потребних након обнове објекта.

    <?php
    class MyClass {
        public $prop1;
        public $resource; // Предпоставимо да је то ресурс везе
        public function __wakeup() {
            // Обнова ресурса, на пример, веза са базом података
            $this->resource = fopen('/tmp/my_file.txt', 'w'); // Пример
            echo "Објекат буди и ресурс обновљен!\n";
        }
        public function __sleep() {
            // У __sleep не серијализујемо ресурс
            return ['prop1'];
        }
        public function __destruct() {
            if (is_resource($this->resource)) {
                fclose($this->resource);
                echo "Ресурс затворен.\n";
            }
        }
    }
    $obj = new MyClass();
    $obj->prop1 = 'deserialized value';
    $serialized = serialize($obj);
    unset($obj);
    
    $deserialized_obj = unserialize($serialized); // Позива __wakeup()
    var_dump($deserialized_obj->prop1);
    
  • __toString(): Позива се када се објекат користи као низ (на пример, при echo или конкатенацији). Трба да врати низово представљање објекта.

    <?php
    class MyClass {
        public $name = "MyObject";
        public function __toString() {
            return "Објекат типа MyClass са именом: " . $this->name;
        }
    }
    $obj = new MyClass();
    echo $obj; // Исписа "Објекат типа MyClass са именом: MyObject"
    
  • __invoke(...): Позива се приликом покушаја позивања објекта као функције. Може примати било који број аргумената.

    <?php
    class MyCallableClass {
        public function __invoke(...$args) {
            echo "Објекат је позван као функција са аргументима: " . implode(', ', $args);
        }
    }
    $obj = new MyCallableClass();
    $obj('arg1', 123); // Исписа "Објекат је позван као функција са аргументима: arg1, 123"
    
  • __set_state(array $properties): Позива се статички за класе које су извозене помоћу var_export(). Добија низ извозених својстава. Трба да креира нови објекат класе и врати га.

    <?php
    class MyClass {
        public $prop;
        public static function __set_state(array $properties) {
            $obj = new MyClass();
            $obj->prop = $properties['prop'];
            return $obj;
        }
    }
    $obj = new MyClass();
    $obj->prop = 'exported value';
    $exported = var_export($obj, true); // Експортира објекат
    // $exported ће садржати код за креирање објекта који користи __set_state()
    eval('$restored_obj = ' . $exported . ';');
    var_dump($restored_obj); // Исписа објекат MyClass са својством 'exported value'
    
  • __debugInfo(): Позива се приликом позива функција типа var_dump() за објекат. Метод треба да врати низ са информацијама о својствима објекта које треба приказати.

    <?php
    class MyClass {
        public $publicProp = 'public';
        private $privateProp = 'private';
        public function __debugInfo() {
            return ['publicProp' => $this->publicProp, 'private_info' => 'неке детаље о privateProp'];
        }
    }
    $obj = new MyClass();
    var_dump($obj); // Исписа информације које враћа __debugInfo()
    
  • __clone(): Позива се након операције клонирања (clone) објекта. Користи се за дубоко копирање унутрашњих објеката или структура података.

    <?php
    class SubObject {
        public $value;
        public function __construct($value) {
            $this->value = $value;
        }
    }
    class MyClass {
        public $object;
        public $anotherProp;
        public function __construct() {
            $this->object = new SubObject('initial');
            $this->anotherProp = 'original';
        }
        public function __clone() {
            // Клонирамо унутрашњи објекат за дубоко копирање
            $this->object = clone $this->object;
        }
    }
    $obj = new MyClass();
    $cloned_obj = clone $obj;
    
    // Сада $obj->object и $cloned_obj->object су различити примерци SubObject
    $cloned_obj->object->value = 'modified';
    
    var_dump($obj->object->value);       // Исписа "initial"
    var_dump($cloned_obj->object->value); // Исписа "modified"
    

Табела са кратким описом:

Метод Опис Позива се при...
__construct() Конструктор класе. Креирање новог примерка класе.
__destruct() Деструктор класе. Уклањање објекта или завршетак скрипте.
__call() Обрада позива несуществујућих/недоступних метода објекта. Покушај позива недоступног или несуществујућег метода објекта.
__callStatic() Обрада позива несуществујућих/недоступних статичких метода. Покушај позива недоступног или несуществујућег статичког метода.
__get() Обрада добијања вредности недоступног/несуществујућег својства. Покушај добијања вредности недоступног или несуществујућег својства.
__set() Обрада постављања вредности недоступног/несуществујућег својства. Покушај постављања вредности недоступног или несуществућег својства.
__isset() Обрада isset() или empty() за својства. Вика се при isset() или empty() на недоступном или несуществућем својству.
__unset() Обрада unset() за својства. Вика се при unset() на недоступном или несуществућем својству.
__sleep() Припрема за серијализацију. Вика се при serialize() за објекат.
__wakeup() Постобрада након десеријализације. Вика се при unserialize() за објекат.
__toString() Строго низово представљање објекта. Коришћење објекта као низа (на пример, при echo).
__invoke() Објекат као функција. Покушај позива објекта као функције.
__set_state() Креирање објекта након извозења са var_export(). Оцена кода, креирано помоћу var_export().
__debugInfo() Информације за отварање грешака (var_dump()). Вика се при var_dump() за објекат.
__clone() Постклонирање. Вика се при clone за објекат.