Anonyma klasser

Från Wiki.linux.se
Version från den 19 augusti 2024 kl. 05.07 av Admin (diskussion | bidrag) (Skapade sidan med '== Anonyma klasser == Anonyma klasser är användbara när enkla, tillfälliga objekt behöver skapas. <pre> <?php // Användning av en explicit klass class Logger { public function log($msg) { echo $msg; } } $util->setLogger(new Logger()); // Användning av en anonym klass $util->setLogger(new class { public function log($msg) { echo $msg; } }); ?> </pre> De kan skicka argument till sina konstruktörer, ärva från andra klas...')
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

Anonyma klasser

Anonyma klasser är användbara när enkla, tillfälliga objekt behöver skapas.

<?php

// Användning av en explicit klass
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// Användning av en anonym klass
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});
?>

De kan skicka argument till sina konstruktörer, ärva från andra klasser, implementera gränssnitt och använda traits precis som en vanlig klass kan:

<?php

class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {
    private $num;

    public function __construct($num)
    {
        $this->num = $num;
    }

    use SomeTrait;
});
?>

Det ovanstående exemplet kommer att skriva ut:

object(class@anonymous)#1 (1) {
  ["Command line code0x104c5b612":"class@anonymous":private]=>
  int(10)
}

Att kapsla in en anonym klass i en annan klass ger den inte tillgång till några privata eller skyddade metoder eller egenskaper hos den yttre klassen. För att kunna använda den yttre klassens skyddade egenskaper eller metoder kan den anonyma klassen ärva den yttre klassen. För att använda den yttre klassens privata egenskaper i den anonyma klassen måste de skickas genom dess konstruktör:

<?php

class Outer
{
    private $prop = 1;
    protected $prop2 = 2;

    protected function func1()
    {
        return 3;
    }

    public function func2()
    {
        return new class($this->prop) extends Outer {
            private $prop3;

            public function __construct($prop)
            {
                $this->prop3 = $prop;
            }

            public function func3()
            {
                return $this->prop2 + $this->prop3 + $this->func1();
            }
        };
    }
}

echo (new Outer)->func2()->func3();
?>

Det ovanstående exemplet kommer att skriva ut:

6

Alla objekt som skapas av samma anonyma klassdeklaration är instanser av just den klassen.

<?php
function anonymous_class()
{
    return new class {};
}

if (get_class(anonymous_class()) === get_class(anonymous_class())) {
    echo 'same class';
} else {
    echo 'different class';
}
?>

Det ovanstående exemplet kommer att skriva ut:

same class

Notera:

Notera att anonyma klasser tilldelas ett namn av motorn, som demonstreras i följande exempel. Detta namn måste betraktas som en implementationsdetalj som inte bör förlitas på.

<?php
echo get_class(new class {});
?>

Det ovanstående exemplet kommer att skriva ut något liknande:

class@anonymous/in/oNi1A0x7f8636ad2021

```


Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.anonymous.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt


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/kontakta-linux-se/