PHP'de hangi sihirli metodlar vardır ve nasıl kullanılırlar?
sobes.tech yapay zeka
AI'dan gelen yanıt
PHP'deki sihirli metodlar, çift alt çizgi ile başlayan özel metodlardır (örneğin, __construct) ve belirli durumlarda otomatik olarak çağrılırlar.
Ana sihirli metodlar ve kullanımları:
-
__construct(): Sınıf nesnesi oluşturulurken çağrılır. Nesnenin özelliklerini başlatmak ve başlangıç işlemleri yapmak için kullanılır.<?php class MyClass { public function __construct() { echo "Nesne oluşturuldu!"; } } $obj = new MyClass(); // "Nesne oluşturuldu!" yazdırır -
__destruct(): Nesne yok edilirken çağrılır (örneğin, script sona erdiğinde veya nesne bellekten silindiğinde). Kaynakları serbest bırakmak için kullanılır (dosya kapama, veritabanı bağlantıları).<?php class MyClass { public function __destruct() { echo "Nesne yok edildi!"; } } $obj = new MyClass(); unset($obj); // "Nesne yok edildi!" yazdırır -
__call(string $name, array $arguments): Nesne bağlamında erişilemeyen veya mevcut olmayan bir metod çağrılmaya çalışıldığında çağrılır.$namemetodun adını,$argumentsise argümanlar dizisini içerir.<?php class MyClass { public function __call($name, $arguments) { echo "Erişilemeyen metod '{$name}' çağrıldı, argümanlar: " . implode(', ', $arguments); } } $obj = new MyClass(); $obj->nonExistentMethod('arg1', 'arg2'); // "Erişilemeyen metod 'nonExistentMethod' çağrıldı, argümanlar: arg1, arg2" yazdırır -
__callStatic(string $name, array $arguments): Sınıf bağlamında erişilemeyen veya mevcut olmayan statik metod çağrıldığında çağrılır.__callile aynıdır, ancak statik çağrılar içindir.<?php class MyClass { public static function __callStatic($name, $arguments) { echo "Erişilemeyen statik metod '{$name}' çağrıldı, argümanlar: " . implode(', ', $arguments); } } MyClass::nonExistentStaticMethod('static_arg'); // "Erişilemeyen statik metod 'nonExistentStaticMethod' çağrıldı, argümanlar: static_arg" yazdırır -
__get(string $name): Nesne bağlamında erişilemeyen veya mevcut olmayan bir özelliğin değeri alınmaya çalışıldığında çağrılır.$nameözelliğin adını içerir.<?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" yazdırır echo $obj->nonExistentKey; // Boş bir satır döner (null döndürülmüşse) -
__set(string $name, mixed $value): Nesne bağlamında erişilemeyen veya mevcut olmayan bir özelliğe değer atanırken çağrılır.$nameözelliğin adını,$valueise atanacak değeri içerir.<?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 ) yazdırır -
__isset(string $name): Nesne bağlamındaisset()veyaempty()fonksiyonlarıyla erişilen özellikler için çağrılır. Boolean döner.<?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) döner var_dump(isset($obj->absent)); // bool(false) döner -
__unset(string $name): Nesne bağlamındaunset()fonksiyonu ile erişilen özellikler için ç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 "Özellik '{$name}' silindi.\n"; } } public function getData() { return $this->data; } } $obj = new MyClass(); print_r($obj->getData()); unset($obj->remove_me); // "Özellik 'remove_me' silindi." yazdırır ve $data içinden siler print_r($obj->getData()); -
__sleep(): Nesne serileştirilmeden önce çağrılır. Serileştirilecek özelliklerin isimlerini içeren dizi döndürmelidir.<?php class MyClass { public $prop1 = 'value1'; public $prop2 = 'value2'; public function __sleep() { return ['prop1']; // Sadece prop1 serileştirilecek } } $obj = new MyClass(); $serialized = serialize($obj); // Sadece prop1 serileştirir echo $serialized; // Yaklaşık olarak O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";} -
__wakeup(): Nesne serileştirmeden sonra çağrılır. Bağlantıları yeniden kurmak veya nesne sonrası yapılması gereken diğer işlemler için kullanılır.<?php class MyClass { public $prop1; public $resource; // Örneğin, bağlantı kaynağı public function __wakeup() { // Kaynağı yeniden kur, örneğin, veritabanı bağlantısı $this->resource = fopen('/tmp/my_file.txt', 'w'); // Örnek echo "Nesne uyandı ve kaynak yeniden kuruldu!\n"; } public function __sleep() { // __sleep içinde kaynağı serileştirmiyoruz return ['prop1']; } public function __destruct() { if (is_resource($this->resource)) { fclose($this->resource); echo "Kaynak kapatıldı.\n"; } } } $obj = new MyClass(); $obj->prop1 = 'serileştirilmiş değer'; $serialized = serialize($obj); unset($obj); $deserialized_obj = unserialize($serialized); // __wakeup() çağrılır var_dump($deserialized_obj->prop1); -
__toString(): Nesne string olarak kullanıldığında çağrılır (örneğin,echoveya konkatenasyon sırasında). Nesnenin string temsili döndürmelidir.<?php class MyClass { public $name = "MyObject"; public function __toString() { return "MyClass türünde nesne, isim: " . $this->name; } } $obj = new MyClass(); echo $obj; // "MyClass türünde nesne, isim: MyObject" yazdırır -
__invoke(...): Nesne fonksiyon gibi çağrıldığında çağrılır. Herhangi sayıda argüman alabilir.<?php class MyCallableClass { public function __invoke(...$args) { echo "Nesne fonksiyon gibi çağrıldı, argümanlar: " . implode(', ', $args); } } $obj = new MyCallableClass(); $obj('arg1', 123); // "Nesne fonksiyon gibi çağrıldı, argümanlar: arg1, 123" yazdırır -
__set_state(array $properties):var_export()ile dışa aktarılmış sınıflar için statik olarak çağrılır. Dışa aktarılan özellikler dizisini alır. Yeni bir nesne oluşturup döndürmelidir.<?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 = 'dışa aktarılmış değer'; $exported = var_export($obj, true); // Nesne dışa aktarılır // $exported, __set_state() kullanan nesne oluşturma kodunu içerecek eval('$restored_obj = ' . $exported . ';'); var_dump($restored_obj); // 'dışa aktarılmış değer' özelliğine sahip MyClass nesnesi döner -
__debugInfo(): Nesne içinvar_dump()gibi hata ayıklama fonksiyonları çağrıldığında çağrılır. Nesnenin gösterilmesini istediğiniz özellikleri içeren bir dizi döndürmelidir.<?php class MyClass { public $publicProp = 'public'; private $privateProp = 'private'; public function __debugInfo() { return ['publicProp' => $this->publicProp, 'private_info' => 'privateProp hakkında bazı detaylar']; } } $obj = new MyClass(); var_dump($obj); // __debugInfo() tarafından döndürülen bilgileri gösterir -
__clone(): Nesne klonlama (clone) işlemi sonrası çağrılır. İç nesnelerin veya veri yapılarının derin kopyası için kullanılır.<?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('başlangıç'); $this->anotherProp = 'orijinal'; } public function __clone() { // İç nesneyi klonla, derin kopya için $this->object = clone $this->object; } } $obj = new MyClass(); $cloned_obj = clone $obj; // Artık $obj->object ve $cloned_obj->object farklı SubObject örnekleri $cloned_obj->object->value = 'değiştirildi'; var_dump($obj->object->value); // "başlangıç" döner var_dump($cloned_obj->object->value); // "değiştirildi" döner
Tablo ile kısa açıklama:
| Metod | Açıklama | Çağrıldığı durum... |
|---|---|---|
__construct() |
Sınıf yapıcı metodu. | Yeni nesne oluşturulurken. |
__destruct() |
Yıkıcı metodu. | Nesne silindiğinde veya script sona erdiğinde. |
__call() |
Mevcut olmayan veya erişilemeyen metod çağrısı. | Erişilemeyen veya mevcut olmayan metod çağrıldığında. |
__callStatic() |
Mevcut olmayan veya erişilemeyen statik metod çağrısı. | Mevcut olmayan veya erişilemeyen statik metod çağrıldığında. |
__get() |
Mevcut olmayan veya erişilemeyen özelliğin değeri alınırken. | Erişilemeyen veya mevcut olmayan özellik değeri alınmaya çalışıldığında. |
__set() |
Mevcut olmayan veya erişilemeyen özelliğe değer atanırken. | Erişilemeyen veya mevcut olmayan özellik atanırken. |
__isset() |
isset() veya empty() ile özellik kontrolü. |
Erişilemeyen veya mevcut olmayan özellikler için. |
__unset() |
unset() ile özellik silme. |
Erişilemeyen veya mevcut olmayan özellikler için. |
__sleep() |
Serileştirme öncesi çağrılır. | Nesne serileştirildiğinde. |
__wakeup() |
Serileştirmeden sonra çağrılır. | Nesne serileştirildikten sonra. |
__toString() |
Nesne string olarak kullanıldığında. | Nesne string bağlamında kullanıldığında. |
__invoke() |
Nesne fonksiyon gibi çağrıldığında. | Nesne fonksiyon gibi çağrıldığında. |
__set_state() |
var_export() ile dışa aktarım sonrası çağrılır. |
var_export() sonucu kod olarak değerlendirilirken. |
__debugInfo() |
var_dump() gibi hata ayıklama fonksiyonları çağrıldığında. |
var_dump() veya benzeri çağrıldığında. |
__clone() |
Klonlama sonrası çağrılır. | Nesne klonlandığında. |