Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Rückrufe und anonyme Funktionen

PHP-Rückrufe und anonyme Funktionen

怪我咯
怪我咯Original
2017-06-28 11:50:22933Durchsuche

Anonyme Funktion ist keine streng objektorientierte Funktion, aber sie ist sehr nützlich, da sie möglicherweise in objektorientierten Anwendungen auftritt, die Rückrufe verwenden.

Bitte schauen Sie sich die folgenden zwei Klassen an:

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

?>

Der Zweck dieses Codes besteht darin, verschiedene Rückrufe auszuführen. Das Produkt speichert nur $name und $price. Processsale besteht aus zwei Methoden. registercallback() akzeptiert einen stillen Skalar, testet den Skalar und fügt ihn dem Callback-Array hinzu. Die integrierte Funktion is_callable(), die die Testfunktion implementiert, stellt sicher, dass der übergebene Wert von Funktionen wie call_user_func() oder array_walk() aufgerufen wird.

Die Methode „process()“ akzeptiert ein Produktobjekt und gibt eine Information aus, die sich auf das Objekt bezieht. Anschließend durchlaufen Sie die Array-Eigenschaft $callbacks.

Vorteile von Callbacks: Mit Callbacks können Sie zur Laufzeit Funktionen in die Komponente einfügen, die nicht direkt mit den Kernaufgaben der Komponente zusammenhängen. Mit Komponentenrückrufen geben Sie anderen die Möglichkeit, Ihren Code in Kontexten zu erweitern, die Sie nicht kennen.

Nehmen wir nun an, der Benutzer möchte einen Verkaufsdatensatz erstellen. Wenn dieser Benutzer direkten Zugriff auf die Klasse hat, können Sie der Methode „process()“ Protokollierungslogik hinzufügen, aber manchmal ist dies eine schlechte Vorgehensweise. Wenn er nicht der Betreuer der Klasse ist, werden seine Änderungen an der Klasse beim nächsten Update überschrieben. Selbst wenn er der Betreuer dieser Komponente ist, spannt das Hinzufügen so vieler zusätzlicher Aufgaben zur Methode „process()“ das Pferd von hinten auf und spiegelt nicht die Kernfunktionalität dieser Methode wider, was die Möglichkeit verringern kann, dass diese Methode projektübergreifend ist.

Glücklicherweise haben wir einen Prozessrückruf erstellt.

<?php
class Product
{
    public $name;
    public $price;

    function construct($name, $price)
    {
        $this->name = $name;
        $this->price= $price;
    }
}

class ProcessSale
{
    private $callbacks;

    function register_callback($callback)
    {
        if(!is_callable($callback))    //判断是否可以调用
        {
            throw new Exception(&#39;callback not callable&#39;);
        }

        $this->callbacks[] = $callback;
    }

    function process($product)
    {
        print "{$product->name}: processing\n";

        foreach($this->callbacks as $callback)
        {
            call_user_func($callback, $product);
        }
    }
}

$logger = create_function(&#39;$product&#39;, &#39;print " logging ({$product->name})\n";&#39;);
$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));
?>
Das Ergebnis läuft von alleine.

PHP 5.3 und spätere Versionen bieten eine bessere Möglichkeit, anonyme Funktionen zu implementieren.

$logger = function($product)
{
     print " logging ({$product->name})\n";
};

$p1 = new ProcessSale();
$p1->register_callback($logger);

$p1->process(new Product("shoes", 8));
print "\n";

$p1->process(new Product("coffee", 9));
Diese Methode verwendet das Funktionsschlüsselwort inline und hat keinen Funktionsnamen. Beachten Sie, dass am Ende des Codeblocks ein Semikolon erforderlich ist, da es sich um eine Inline-Anweisung handelt.

Rückrufe müssen nicht anonym sein, Sie können

Funktionsnamen (oder sogar Objektreferenzen und Methoden) als Rückrufe verwenden.

Das obige ist der detaillierte Inhalt vonPHP-Rückrufe und anonyme Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn