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.$namemetodun adını,$argumentsisə 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.__callilə 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.$namexü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.$namexüsusiyyətin adını,$valueisə 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ə yaempty()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,echovə 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(): Objekticloneə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. |