Sobes.tech
Middle

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. $name metodun adını, $arguments ise 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. __call ile 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ı, $value ise 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ında isset() veya empty() 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ında unset() 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, echo veya 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çin var_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.