Özniteliklere giriş

(PHP 8)

Öznitelikler, koddaki bildirimlerin üzerine yapılandırılmış, makine tarafından okunabilir meta veri bilgilerinin eklenmesini sağlar: Sınıflar, yöntemler, işlevler, değiştirgeler, özellikler ve sınıf sabitleri bir özniteliğin hedefi olabilir. Özniteliklerle tanımlanan meta veriler daha sonra Yansıtma Arayüzleri kullanılarak çalışma anında incelenebilir. Bu nedenle öznitelikler, doğrudan koda gömülmüş bir yapılandırma dili olarak düşünülebilir.

Özniteliklerle, bir özelliğin kapsamlı gerçeklenimi ile bir uygulamadaki somut kullanımı ayrıştırılabilir. Bir bakıma arayüzler, gerçeklenimleri ile karşılaştırılabilir. Ancak arayüzlerin ve gerçeklenimlerin kodla ilgili olduğu yerlerde öznitelikler, ek bilgi ve yapılandırmaya küçük açıklamalar eklemekle ilgilidir. Arayüzler sınıflarla gerçeklenebilir, ancak öznitelikler ek olarak yöntemler, işlevler, değiştirgeler, özellikler ve sınıf sabitleri üzerinde de bildirilebilir. Bu nedenle arayüzlerden daha esnektir.

Öznitelik kullanımına basit bir örnek, öznitelikleri kullanmak için isteğe bağlı yöntemlere sahip bir arayüzü dönüştürmektir. ActionHandler arayüzünün bir uygulamadaki bir işlemi yerine getirdiğini ve bu arayüzün bazı gerçeklenimlerinin ilklendirilmesi gerekirken diğerlerine bunun gerekmediğini varsayalım. ActionHandler arayüzünü gerçekleyen tüm sınıfların setUp() yöntemini gerçeklemesi gerekirken, bunu yapmak yerine, onun yerini alabilecek bir öznitelik kullanılabilir. Bu yaklaşımın tek yararı, öznitelliğin birkaç kez kullanabilmesidir.

Örnek 1 - Bir arayüzün isteğe bağlı yöntemlerini özniteliklerle gerçeklemek

<?php
interface ActionHandler
{
    public function 
execute();
}

#[Attribute]
class SetUp {}

class 
CopyFile implements ActionHandler
{
    public 
string $fileName;
    public 
string $targetDirectory;

    
#[SetUp]
    
public function fileExists()
    {
        if (!
file_exists($this->fileName)) {
            throw new 
RuntimeException("Dosya yok");
        }
    }

    
#[SetUp]
    
public function targetDirectoryExists()
    {
        if (!
file_exists($this->targetDirectory)) {
            
mkdir($this->targetDirectory);
        } elseif (!
is_dir($this->targetDirectory)) {
            throw new 
RuntimeException("Hedef dizin $this->targetDirectory bir dizin değil");
        }
    }

    public function 
execute()
    {
        
copy($this->fileName$this->targetDirectory '/' basename($this->fileName));
    }
}

function 
executeAction(ActionHandler $actionHandler)
{
    
$reflection = new ReflectionObject($actionHandler);

    foreach (
$reflection->getMethods() as $method) {
        
$attributes $method->getAttributes(SetUp::class);

        if (
count($attributes) > 0) {
            
$methodName $method->getName();

            
$actionHandler->$methodName();
        }
    }

    
$actionHandler->execute();
}

$copyAction = new CopyFile();
$copyAction->fileName "/tmp/foo.jpg";
$copyAction->targetDirectory "/home/user";

executeAction($copyAction);
add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top