Sihirli Yöntemler


    × Bunları biliyor muydunuz?
"Dinamik bir kütüphaneyi tanımlarken sınıf isminin başına Internal ön eki getirirerek statik erişimli hale getirebilirsiniz. "


PHP'de sihirli yöntemler sınıfa çeşitli beceriler kazandırmayı sağlayan PHP tarafından rezervedilmiş özel yöntemlerdir. Bu yöntemler standart olarak iki alt tire (__) ile başlar ve sadece sınıflar içerisinde kullanılabilirler. Aşağıdaki tabloda bu yöntemlerin neler olduğu ve ne için kullanıldığı gösterilmiştir.

Sihirli Yöntem                           Açıklama
void __construct(mixed ...$args) Yapıcı yöntemi yaygın olarak başlangıçta gereken yapılandırmaları düzenlemek ve bir niteliğe ait değeri alt yöntemlere iletmek için kullanılır.
void __destruct(void) Yapıcı yönteminin tersine yıkıcı yöntem, bir sınıfa ait son nesne kullanımından sonra devreye girer.
mixed __call(string $method, array $parameters) Bir sınıfa ait olmayan bir yöntem çağrıldığında devreye girer.
mixed
__callStatic(string $method, array $parameters)
Bir sınıfa ait olmayan statik bir yöntem çağrıldığında devreye girer. Bu yöntemin statik olarak belirtilmesi gereklidir.
mixed __get(string $name) Bir sınıfa ait olmayan bir nitelik çağrıldığında devreye girer.
void __set(string $name, mixed $value) Bir sınıfa ait olmayan bir niteliğe değer ataması yapılırken devreye girer.
string __toString(void) Bir nesnenin dizge türüne dönüştürülmesi veya echo ile kullanılması durumunda devreye girer.
bool __isset(string $name) Bir sınıfa ait olmayan bir niteliğin isset() ile kontrol edilmesi ile devreye girer.
void __unset(string $name) Bir sınıfa ait olmayan bir niteliğin unset() ile kullanılması ile devreye girer.
array __sleep(void) Bir sınıfa ait örneğin serialize() ile kullanılması ile devreye girer. Sınıfa ait niteliklerin isimlerinden oluşan bir diziyi serialize() ile özel çıktılanabilir forma sokar.
void __wakeup(void) Bir sınıfa ait örneğin serialize() edilmesinden sonra serileştirilen özel verinin tekrardan unserialize() edilmesi durumunda devreye girer. 
mixed __invoke(mixed ...$args) Bir sınıfa ait örneğin fonksiyon olarak kullanılması durumunda devreye girer.
void __clone(void) Bir sınıfa ait örneğin clone anahtarı ile klonlanması durumunda devreye girer.
array __debugInfo(void) Bir sınıfa ait örneğin var_dump() ile kullanılması durumunda devreye girer.

 

 

# Construct


Yapıcı yöntemi yaygın olarak başlangıçta gereken yapılandırmaları düzenlemek ve bir niteliğe ait değeri alt yöntemlere iletmek için kullanılır. Ayrıca bir sınıftan örnek türetilirken sınıfa parametre göndermi de sağlar. Bu yöntem bir sınıf örneği oluşturulduğu anda tüm yöntem ve niteliklerin kullanımından önce ve 1 kereliğe mahsus devreye girer.

Parametreler
mixed ...$args Sıralı parametreler.
return void
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __construct($parameter)
    {
        echo $parameter . ' guys!';
    }
}

$example = new Example('Hi');
Hi guys!

Şimdi de daha önce oluşturduğumuz Vehicle:: ve Automobile:: sınıfları üzerinden kullanımına örnek verelim. 

Dosya: Vehicle.php
class Vehicle
{
    protected $color = 'White';

    public function __construct(string $color = NULL)
    {
        if( $color !== NULL )
        {
            $this->color = $color;
        }
    }
 
    public function startEngine(array $connection)
    {
        return $connection;
    }

    public function setColor(string $color)
    {
        $this->color = $color;
    }

    public function getColor() : string
    {
        return $this->color;
    }
}
Dosya: index.php
<?php 

require 'Vehicle.php';
require 'Automobile.php';

$automobile = new Automobile('Blue'); # Vehicle::__construct() yöntemine parametre gönderiliyor.

echo $automobile->getColor();
Blue

Yukarıdaki örnekte new ile sınıf tanımlaması yaparken nasıl parametre gönderdiğimize dikkat edin. 

 

 

# Destruct


Bu yöntem __construct() yapıcısının tersine bir sınıf örneğine ait en son kullanılan  nitelik veya yöntem kullanımından sonra devreye girer. Yani bir örneğin en son çalışan yöntemidir. Genellikle __construct() yapıcısı ile başlatılan bir işleminin örnek kullanımından sonra sonlandırılması için kullanılır.

Parametreler
void
return void
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __construct($parameter)
    {
        echo $parameter . ' guys!<br>';
    }

    public function __destruct()
    {
        echo 'Goodbye!';
    }
}

$example = new Example('Hi');
Hi guys!
Goodbye!

 

 

# Call & CallStatic


Bir sınıfa ait olmayan bir yöntem çağrıldığında devreye girer. Böyle bir kullanımın amacı esnek yöntem kullanımı sağlamaktır.

Bilgi: Yöntemlerin aşırı yüklenmesi olarak bilinir.
Parametreler
string $method Sınıfa ait olmayan bir yöntemin çağrılması durumunda bu çağrılan yöntemin ismini döndürür.
array $parameters Çağrılan bu yönteme gönderilen parametrelerin dizi türünden listesini verir.
return mixed
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __construct($parameter)
    {
        echo $parameter . ' guys!<br>';
    }

    public function __call($method, $parameters)
    {
        echo $method . ' ' . $parameters[0] . '<br>';
    }

    public function __destruct()
    {
        echo 'Goodbye!';
    }
}

$example = new Example('Hi');
$example->thank('you!')
Hi guys!
thank you!
Goodbye!

Yukarıdaki kodda dikkat edilirse olmayan Example::thank() yöntemi çağrıldığında __call() devreye girmiştir.

Şimdi de daha önce oluşturduğumuz Vehicle:: sınıfı üzerinden kullanımına örnek verelim. 

Dosya: Vehicle.php
class Vehicle
{
    protected $color = 'White';

    public function __construct(string $color = NULL)
    {
        if( $color !== NULL )
        {
            $this->color = $color;
        }
    }

    public function __call($method, $parameters)
    {
        throw Exception('Invalid object call!');
    }
 
    public function startEngine(array $connection)
    {
        return $connection;
    }

    public function setColor(string $color)
    {
        $this->color = $color;
    }

    public function getColor() : string
    {
        return $this->color;
    }
}
Dosya: index.php
<?php 

require 'Vehicle.php';
require 'Automobile.php';

$automobile = new Automobile('Blue');

echo $automobile->getName();
Invalid object call!
CallStatic

Bu yöntemin __call() yönteminden tek farkı olmayan bir yöntemin statik olarak çağrılması ile devreye girmesidir. Statik çağrımla devreye girdiğinden bu yöntem de statik olarak bildirilmesi gerekmektedir.

Dosya: Example.php
<?php class Example
{
    public function __construct($parameter)
    {
        echo $parameter . ' guys!<br>';
    }

    public static function __callStatic($method, $parameters)
    {
        echo $method . ' ' . $parameters[0] . '<br>';
    }
}

Example::thank('you!');
thank you! 

 

 

# Get


Bu yöntemde __call() yöntemi gibidir. Ancak olmayan bir yöntem yerine nitelik çağrıldığında devreye girer.

Bilgi: Niteliklerin aşırı yüklenmesi olarak bilinir.
Parametreler
string $name Çağrılan niteliğin ismi.
return mixed
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __get($property)
    {
        echo $property . '<br>';
    }
}

$example = new Example;
echo $example->thankYou;
thankYou

Şimdi de daha önce oluşturduğumuz Vehicle:: sınıfı üzerinden kullanımına örnek verelim. 

Dosya: Vehicle.php
class Vehicle
{
    protected $color = 'White';

    public function __construct(string $color = NULL)
    {
        if( $color !== NULL )
        {
            $this->color = $color;
        }
    }

    public function __call($method, $parameters)
    {
        throw Exception('Invalid object call!');
    }

    public function __get($property)
    {
        throw Exception('Invalid property call!');
    }
 
    public function startEngine(array $connection)
    {
        return $connection;
    }

    public function setColor(string $color)
    {
        $this->color = $color;
    }

    public function getColor() : string
    {
        return $this->color;
    }
}
Dosya: index.php
<?php 

require 'Vehicle.php';
require 'Automobile.php';

$automobile = new Automobile('Blue');

echo $automobile->getName;
Invalid property call!

 

 

# Set


Bu yöntemin kullanımı __get() yöntemini tetikleyen sınıfa ait olmayan bir niteliğe atama yapmaya çalıştığınızda tetiklenir.

Bilgi: Niteliklerin aşırı yüklenmesi olarak bilinir.
Parametreler
string $name Çağrılan niteliğin ismi.
mixed $value Niteliğin değeri.
return mixed
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __get($property)
    {
        echo $property . '<br>';
    }

    public function __set($property, $value)
    {
        echo $property . ':' . $value;
    }
}

$example = new Example;
$example->thank = 'you';
thank:you

 

 

# ToString


Bir sınıf örneğinin string türüne dönüştürülmesi veya echo ile kullanılması durumunda devreye girer.

Bilgi: Bir nesneyi metin olarak temsil etme olarak bilinir.
Parametreler
void
return string
Kullanımı
Dosya: Example.php
<?php class Example
{
    protected $getName = __CLASS__;

    public function __toString()
    {
        return $this->getName . '<br>';
    }

    public function setName($name)
    {
        $this->getName = $name;

        return $this;
    }
}

$example = new Example;
 
echo $example;

# Bu yöntem $this ile sınıfın kendisini döndürdüğünden sınıfın örneği 
# gibi kabul edilip __toString() yönteminin tetiklenmesine neden olur.
echo $example->setName('New Name');
Example
New Name

 

 

# Isset & Unset


Bu  yöntem sınıfa ait olmayan bir niteliğin isset() ile kontrol edilmesi ile devreye girer.

Bilgi: Niteliklerin aşırı yüklenmesi olarak bilinir.
Parametreler
string $name Çağrılan niteliğin ismi.
return mixed
Kullanımı
Dosya: Example.php
<?php class Example
{
    public function __isset($property)
    {
        echo 'Undefined property:' . $property;
    }
}

$example = new Example;

if( isset($example->getName) )
{
    # Kodlarınız...
}
Undefined property:getName
Unset 

Bu yöntemin kullanımı __isset() gibidir. Tek farkı olmayan bir niteliğin isset() yerine unset() ile kontrol edildiğinde tetiklenmesi. 

Dosya: Example.php
<?php class Example
{
    public function __unset($property)
    {
        echo 'Undefined property:' . $property;
    }
}

$example = new Example;

if( unset($example->getName) )
{
    # Kodlarınız...
}
Undefined property:getName

 

 

# Sleep


Bir sınıfa ait örneğin serialize() ile kullanılması ile devreye girer. Sınıfa ait niteliklerin isimlerinden oluşan bir diziyi serialize() ile özel çıktılanabilir forma sokar.

Parametreler
void
return array
Kullanımı
<?php class Example
{
    protected $name, $phone;

    public function __construct($name, $phone)
    {
        $this->name  = $name;
        $this->phone = $phone;
    }

    public function __sleep()
    {
        return ['name', 'phone']; # Serileştirilecek nitelik isimleri.
    }
}

$example = new Example('New Name', '1234');

echo serialize($example);
O:7:"Example":2:{s:7:"*name";s:8:"New Name";s:8:"*phone";s:4:"1234";}

 

 

# Wakeup


Bir sınıfa ait örneğin serialize() edilmesinden sonra serileştirilen özel verinin tekrardan unserialize() edilmesi durumunda devreye girer. Bu yöntemin devreye girilmesi için sınıfın __sleep() yönteminin kullanılıyor olması gerekir.

Parametreler
void
return void
Kullanımı
<?php class Example
{
    protected $name, $phone;

    public function __construct($name, $phone)
    {
        $this->name  = $name;
        $this->phone = $phone;
    }

    public function __sleep()
    {
        return ['name', 'phone'];
    }

    public function __wakeup()
    {
        echo 'Wakeup!<br>';
    }
}

$example = new Example('New Name', '1234');

$data = unserialize(serialize($example));

var_dump($data);
Wakeup!
object(Example)#2 (2) { ["name":protected]=> string(8) "New Name" ["phone":protected]=> string(4) "1234" }

 

 

# Invoke


Bir sınıfa ait örneğin fonksiyon olarak kullanılması durumunda devreye girer.

Parametreler
mixed ...$parameters Örneğe gönderilen parameterler.
return mixed
Kullanımı
<?php class Example
{
    public function __invoke(...$parameters)
    {
        foreach( $parameters as $parameter )
        {
            echo $parameter . '<br>';
        } 
    }
}

$example = new Example;

$example('Example', 1, true, NULL, 'Data');
Example
1
true
NULL
Data

 

 

# Clone


Bir sınıfa ait örneğin clone anahtarı ile klonlanması durumunda devreye girer.

Parametreler
void
return void
Kullanımı
<?php class Example
{
    public function __clone()
    {
        echo 'Instance cloned!';
    }
}

$example = new Example;

$clone = clone $example;
Instance cloned!

 

 

# DebugInfo


Bir sınıfa ait örneğin var_dump() ile kullanılması durumunda devreye girer.

Parametreler
void
return array
Kullanımı
<?php class Example
{
    public function __debugInfo()
    {
        return debug_backtrace(2);
    }
}

$example = new Example;

var_dump($example);
object(Example)#1 (2)
{
    [0] => array(3)
    {
        ["function"] => "__debugInfo"
        ["class"]    => "Example"
        ["type"]     => "->"
    }
    [1] => array(3)
    {
        ["file"]     => "C:\xampp\htdocs\Example.php"
        ["line"]     => 0
        ["function"] => "var_dump"
    }
}