Översikt av attribut

Från Wiki.linux.se
Version från den 24 augusti 2024 kl. 11.55 av Admin (diskussion | bidrag) (→‎Sidslut)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

Översikt av attribut

(PHP 8)

Attribut erbjuder möjligheten att lägga till strukturerad, maskinläsbar metadata på deklarationer i koden: klasser, metoder, funktioner, parametrar, egenskaper och klasskonstanter kan vara målet för ett attribut. Den metadata som definieras av attribut kan sedan inspekteras vid körning med hjälp av Reflection API. Attribut kan därför ses som ett konfigurationsspråk som är inbäddat direkt i koden.

Med attribut kan den generiska implementeringen av en funktion och dess konkreta användning i en applikation separeras. På ett sätt är det jämförbart med gränssnitt (interfaces) och deras implementeringar. Men där gränssnitt och implementeringar handlar om kod, handlar attribut om att lägga till extra information och konfiguration. Gränssnitt kan implementeras av klasser, men attribut kan också deklareras på metoder, funktioner, parametrar, egenskaper och klasskonstanter. På så sätt är de mer flexibla än gränssnitt.

Ett enkelt exempel på användning av attribut är att konvertera ett gränssnitt som har valfria metoder till att använda attribut. Låt oss anta att vi har ett gränssnitt ActionHandler som representerar en operation i en applikation, där vissa implementeringar av en action handler kräver förberedelser och andra inte. Istället för att kräva att alla klasser som implementerar ActionHandler implementerar en metod setUp(), kan ett attribut användas. En fördel med detta tillvägagångssätt är att vi kan använda attributet flera gånger.

Exempel #1 Implementering av valfria metoder i ett gränssnitt med attribut

<?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("Filen finns inte");
        }
    }

    #[SetUp]
    public function targetDirectoryExists()
    {
        if (!file_exists($this->targetDirectory)) {
            mkdir($this->targetDirectory);
        } elseif (!is_dir($this->targetDirectory)) {
            throw new RuntimeException("Målmappen $this->targetDirectory är inte en katalog");
        }
    }

    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);
?>


Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.attributes.overview.php
PHP
Språkreferens
Språkreferens#Referenser Förklarade


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webserver.