Sobes.tech
Middle

PHP-də hansı sehrli metodlar mövcuddur və necə istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

PHP-də sehrli metodlar xüsusi metodlardır və iki alt xətindən başlayır (məsələn, __construct), hansı ki, müəyyən vəziyyətlərdə avtomatik çağırılır.

Əsas sehrli metodlar və onların istifadəsi:

  • __construct(): Sinif obyektinin yaradılması zamanı çağırılır. Obyektin xüsusiyyətlərinin ilkinləşdirilməsi və başlanğıc əməliyyatların yerinə yetirilməsi üçün istifadə olunur.

    <?php
    class MyClass {
        public function __construct() {
            echo "Obyekt yaradıldı!";
        }
    }
    $obj = new MyClass(); // "Obyekt yaradıldı!" çıxaracaq
    
  • __destruct(): Obyekt məhv edilərkən çağırılır (məsələn, skript tamamlandıqda və ya obyekt yaddaşdan silindikdə). Resursların azad olunması üçün istifadə olunur (faylların bağlanması, verilənlər bazası əlaqələrinin bağlanması).

    <?php
    class MyClass {
        public function __destruct() {
            echo "Obyekt məhv edildi!";
        }
    }
    $obj = new MyClass();
    unset($obj); // "Obyekt məhv edildi!" çıxaracaq
    
  • __call(string $name, array $arguments): Obyekt kontekstində mövcud olmayan və ya əlçatan olmayan metodu çağırmağa çalışdıqda çağırılır. $name metodun adını, $arguments isə arqumentlər massivini ehtiva edir.

    <?php
    class MyClass {
        public function __call($name, $arguments) {
            echo "Əlçatan olmayan '{$name}' metodu çağırıldı və arqumentlər: " . implode(', ', $arguments);
        }
    }
    $obj = new MyClass();
    $obj->nonExistentMethod('arg1', 'arg2'); // "Əlçatan olmayan 'nonExistentMethod' metodu çağırıldı və arqumentlər: arg1, arg2" çıxaracaq
    
  • __callStatic(string $name, array $arguments): Statik metodlar kontekstində mövcud olmayan və ya əlçatan olmayan statik metodu çağırmağa çalışdıqda çağırılır. __call ilə oxşardır, lakin statik çağırışlar üçün.

    <?php
    class MyClass {
        public static function __callStatic($name, $arguments) {
            echo "Əlçatan olmayan statik '{$name}' metodu və arqumentlər: " . implode(', ', $arguments);
        }
    }
    MyClass::nonExistentStaticMethod('static_arg'); // "Əlçatan olmayan 'nonExistentStaticMethod' metodu və arqumentlər: static_arg" çıxaracaq
    
  • __get(string $name): Obyekt kontekstində əlçatan olmayan və ya mövcud olmayan xüsusiyyətin dəyərini almağa çalışdıqda çağırılır. $name xüsusiyyətin adını ehtiva edir.

    <?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" çıxaracaq
    echo $obj->nonExistentKey; // Boş sətir çıxaracaq (null dəyərindən asılı olaraq)
    
  • __set(string $name, mixed $value): Obyekt kontekstində əlçatan olmayan və ya mövcud olmayan xüsusiyyətə dəyər təyin etməyə çalışdıqda çağırılır. $name xüsusiyyətin adını, $value isə təyin olunan dəyəri ehtiva edir.

    <?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 ) çıxaracaq
    
  • __isset(string $name): isset() və ya empty() funksiyalarını əlçatan olmayan və ya mövcud olmayan xüsusiyyət üzərində çağırdıqda çağırılır. Boolean dəyər qaytarır.

    <?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) çıxaracaq
    var_dump(isset($obj->absent));      // bool(false) çıxaracaq
    
  • __unset(string $name): unset() funksiyasını əlçatan olmayan və ya mövcud olmayan xüsusiyyət üzərində çağırdıqda çağırılır.

    <?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 "Xüsusiyyət '{$name}' silindi.\n";
            }
        }
        public function getData() {
            return $this->data;
        }
    }
    $obj = new MyClass();
    print_r($obj->getData());
    unset($obj->remove_me); // "Xüsusiyyət 'remove_me' silindi." çıxaracaq və element $data-dan silinəcək
    print_r($obj->getData());
    
  • __sleep(): serialize() istifadə edilərək obyektin seriyalaşdırılmasından əvvəl çağırılır. Seriyalaşdırılacaq xüsusiyyətlərin adlarını ehtiva edən massiv qaytarmalıdır.

    <?php
    class MyClass {
        public $prop1 = 'value1';
        public $prop2 = 'value2';
        public function __sleep() {
            return ['prop1']; // Yalnız prop1 seriyalaşdırılır
        }
    }
    $obj = new MyClass();
    $serialized = serialize($obj); // Yalnız prop1 seriyalaşdırılır
    echo $serialized; // Təqribən O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";}
    
  • __wakeup(): unserialize() istifadə edilərək obyektin deserializasiyasından sonra çağırılır. Bağlantıların bərpası və ya obyektin bərpası üçün digər əməliyyatlar üçün istifadə olunur.

    <?php
    class MyClass {
        public $prop1;
        public $resource; // Tutaq ki, bu resurs əlaqəsidir
        public function __wakeup() {
            // Resursu bərpa et, məsələn, verilənlər bazası əlaqəsi
            $this->resource = fopen('/tmp/my_file.txt', 'w'); // Nümunə
            echo "Obyekt yuxudan oyandı və resurs bərpa olundu!\n";
        }
        public function __sleep() {
            // __sleep-də resursu seriyalaşdırmırıq
            return ['prop1'];
        }
        public function __destruct() {
            if (is_resource($this->resource)) {
                fclose($this->resource);
                echo "Resurs bağlandı.\n";
            }
        }
    }
    $obj = new MyClass();
    $obj->prop1 = 'deserialized value';
    $serialized = serialize($obj);
    unset($obj);
    
    $deserialized_obj = unserialize($serialized); // __wakeup() çağırılacaq
    var_dump($deserialized_obj->prop1);
    
  • __toString(): Obyektin sətir kimi istifadə olunduğu zaman çağırılır (məsələn, echo və ya konkatenasiya zamanı). Obyektin sətirlik təqdimatını qaytarmalıdır.

    <?php
    class MyClass {
        public $name = "MyObject";
        public function __toString() {
            return "MyClass tipli obyekt, adı: " . $this->name;
        }
    }
    $obj = new MyClass();
    echo $obj; // "MyClass tipli obyekt, adı: MyObject" çıxaracaq
    
  • __invoke(...): Obyektin funksiya kimi çağırılması zamanı çağırılır. Hər hansı sayda arqument qəbul edə bilər.

    <?php
    class MyCallableClass {
        public function __invoke(...$args) {
            echo "Obyekt funksiyaya çağırıldı və arqumentlər: " . implode(', ', $args);
        }
    }
    $obj = new MyCallableClass();
    $obj('arg1', 123); // "Obyekt funksiyaya çağırıldı və arqumentlər: arg1, 123" çıxaracaq
    
  • __set_state(array $properties): var_export() ilə ixrac edilən siniflər üçün statik çağırılır. İxrac edilən xüsusiyyətlərin massivini alır. Yeni obyekt yaradır və onu qaytarır.

    <?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); // Obyekti ixrac edir
    // $exported kodu obyekt yaratmaq üçün istifadə ediləcək, __set_state() istifadə edir
    eval('$restored_obj = ' . $exported . ';');
    var_dump($restored_obj); // 'exported value' xüsusiyyətinə malik MyClass obyektini göstərəcək
    
  • __debugInfo(): var_dump() kimi funksiyalar obyekt üçün çağırıldıqda çağırılır. Obyektin xüsusiyyətləri haqqında məlumatların göstəriləcək massivini qaytarmalıdır.

    <?php
    class MyClass {
        public $publicProp = 'public';
        private $privateProp = 'private';
        public function __debugInfo() {
            return ['publicProp' => $this->publicProp, 'private_info' => 'privateProp haqqında bəzi detallər'];
        }
    }
    $obj = new MyClass();
    var_dump($obj); // __debugInfo() tərəfindən qaytarılan məlumatı göstərəcək
    
  • __clone(): Objekti clone əməliyyatı ilə klonladıqdan sonra çağırılır. Dərin kopyalama üçün daxili obyektlərin və ya məlumat strukturlarının kopyalanması üçün istifadə olunur.

    <?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() {
            // Dərin kopyalama üçün daxili obyekti klonlayırıq
            $this->object = clone $this->object;
        }
    }
    $obj = new MyClass();
    $cloned_obj = clone $obj;
    
    // İndi $obj->object və $cloned_obj->object fərqli SubObject nümunələridir
    $cloned_obj->object->value = 'değişdirildi';
    
    var_dump($obj->object->value);       // "initial" çıxaracaq
    var_dump($cloned_obj->object->value); // "değişdirildi" çıxaracaq
    

Qısa xülasə ilə cədvəl:

Metod Təsviri Çağırılır...
__construct() Sinifin konstruktoru. Yeni nümunə yaradıldıqda.
__destruct() Sinifin destruktoru. Obiekt silindikdə və ya skript tamamlandıqda.
__call() Mövcud olmayan və ya əlçatan olmayan metodların çağırılması. Mövcud olmayan və ya əlçatan olmayan metod çağırıldıqda.
__callStatic() Mövcud olmayan və ya əlçatan olmayan statik metodların çağırılması. Mövcud olmayan və ya əlçatan olmayan statik metod çağırıldıqda.
__get() Mövcud olmayan və ya əlçatan olmayan xüsusiyyətin alınması. Mövcud olmayan və ya əlçatan olmayan xüsusiyyətin dəyərinin alınması.
__set() Mövcud olmayan və ya əlçatan olmayan xüsusiyyətə dəyər təyin edilməsi. Mövcud olmayan və ya əlçatan olmayan xüsusiyyətə dəyər təyin edildikdə.
__isset() isset() və ya empty() üçün xüsusiyyətlərin yoxlanması. Mövcud olmayan və ya əlçatan olmayan xüsusiyyət üçün isset() və ya empty() çağırıldıqda.
__unset() Mövcud olmayan və ya əlçatan olmayan xüsusiyyətin silinməsi. Mövcud olmayan və ya əlçatan olmayan xüsusiyyət üçün unset() çağırıldıqda.
__sleep() Seriyalaşdırma üçün hazırlıq. serialize() çağırıldıqda.
__wakeup() Deserializasiya sonrası post-eməliyyatlar. unserialize() çağırıldıqda.
__toString() Obyektin sətir kimi təqdimatı. Obyekt sətir kimi istifadə olunduqda (məsələn, echo).
__invoke() Obyektin funksiya kimi çağırılması. Obyektin funksiya kimi çağırılması cəhdində.
__set_state() var_export() ilə ixrac edilən obyektin yenidən yaradılması. var_export() tərəfindən yaradılan kodun qiymətləndirilməsi zamanı.
__debugInfo() var_dump() kimi funksiyalar üçün obyekt haqqında məlumat. var_dump() çağırıldıqda.
__clone() Klonlama sonrası post-eməliyyatlar. clone əməliyyatı ilə çağırıldıqda.