Rechercher une fonction PHP

Anonyme Funktionen

Anonyme Funktionen, auch bekannt als Closures, ermöglichen es Funktionen ohne Funktionsnamen zu schreiben. Sie sind am wertvollsten als Werte von Callback-Parametern, haben aber noch viele andere Verwendungsmöglichkeiten.

Anonyme Funktionen werden unter Verwendung der Closure-Klasse implementiert.

Beispiel #1 Beispiel für eine anonyme Funktion

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return 
strtoupper($match[1]);
}, 
'hallo-welt');
// gibt halloWelt aus
?>

Closures können auch als Werte von Variablen verwendet werden; PHP konvertiert solche Ausdrücke automatisch in Instanzen der internen Klasse Closure. Die Zuweisung einer Closure an eine Variable verwendet die selbe Syntax wie andere Zuweisungen, einschließlich des abschließenden Semikolon:

Beispiel #2 Beispiel für die Zuweisung einer anonymen Funktion

<?php
$greet 
= function($name)
{
    
printf("Hallo %s\r\n"$name);
};

$greet('Welt');
$greet('PHP');
?>

Closures können ebenfalls Variablen aus dem Eltern-Gültigkeitsbereich erben. Jede solche Variable muss an das use-Sprachkonstrukt übergeben werden. Von PHP 7.1 an dürfen diese Variablen keine superglobals, $this oder Variablen mit dem gleichen Name wie ein Paramter sein.

Beispiel #3 Erben von Variablen aus dem Eltern-Scope

<?php
$message 
'hallo';

// Kein "use"
$example = function () {
    
var_dump($message);
};
$example();

// $message vererben
$example = function () use ($message) {
    
var_dump($message);
};
$example();

// der Wert einer geerbten Variable ist der zum Zeitpunkt
// der Funktionsdefinition, nicht des Funktionsaufrufs
$message 'welt';
$example();

// $message wieder herstellen
$message 'hallo';

// vererben per Referenz
$example = function () use (&$message) {
    
var_dump($message);
};
$example();

// Der geänderte Wert im Eltern-Gültigkeitsbereich
// wird in der aufgerufenen Funktion reflektiert
$message 'welt';
$example();

// Closures können ebenfalls reguläre Parameter akzeptieren
$example = function ($arg) use ($message) {
    
var_dump($arg ' ' $message);
};
$example("hallo");
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Notice: Undefined variable: message in /example.php on line 6
NULL
string(5) "hallo"
string(5) "hallo"
string(5) "hallo"
string(4) "welt"
string(10) "hallo welt"

Das Erben von Variablen aus dem Eltern-Gültigkeitsbereich ist nicht das gleiche wie die Verwendung von globalen Variablen. Globale Variablen existieren im globalen Gültigkeitsbereich, der immer der gleiche ist, unabhängig davon welche Funktion ausgeführt wird. Der Eltern-Gültigkeitsbereich einer Closure ist die Funktion, in der die Closure deklariert wurde (nicht notwendigerweise die Funktion, aus der sie aufgerufen wurde). Betrachten Sie das folgende Beispiel:

Beispiel #4 Closures und Gültigkeitsbereiche

<?php
// Ein einfacher Einkaufswagen, der eine Liste von hinzugefügten Produkten
// enthält, und die Menge jedes Produkts. Enthält eine Methode, die den
// Gesamtpreise der Waren im Einkaufswagen unter Verwendung einer Closure
// als Callback berechnet.
class Cart
{
    const 
PRICE_BUTTER  1.00;
    const 
PRICE_MILK    3.00;
    const 
PRICE_EGGS    6.95;

    protected 
$products = array();
    
    public function 
add($product$quantity)
    {
        
$this->products[$product] = $quantity;
    }
    
    public function 
getQuantity($product)
    {
        return isset(
$this->products[$product]) ? $this->products[$product] :
               
FALSE;
    }
    
    public function 
getTotal($tax)
    {
        
$total 0.00;
        
        
$callback =
            function (
$quantity$product) use ($tax, &$total)
            {
                
$pricePerItem constant(__CLASS__ "::PRICE_" .
                    
strtoupper($product));
                
$total += ($pricePerItem $quantity) * ($tax 1.0);
            };
        
        
array_walk($this->products$callback);
        return 
round($total2);
    }
}

$my_cart = new Cart;

// Lege ein paar Waren in den Einkaufskorb
$my_cart->add('butter'1);
$my_cart->add('milk'3);
$my_cart->add('eggs'6);

// Gib die Gesamtsumme mit einer Mehrwertsteuer von 5% aus
print $my_cart->getTotal(0.05) . "\n";
// Das Ergebnis ist 54.29
?>

Beispiel #5 Automatisches Binden von $this

<?php

class Test
{
    public function 
testing()
    {
        return function() {
            
var_dump($this);
        };
    }
}

$object = new Test;
$function $object->testing();
$function();
    
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe mit PHP 5.3:

Notice: Undefined variable: this in script.php on line 8
NULL

Wird ab PHP 5.4.0 eine anonyme Funktion im Kontext einer Klasse deklariert, so wird diese Klasse automatisch an jene gebunden, was $this innerhalb des Geltungbereichs verfügbar macht. Ist diese automatische Bindung der aktuellen Klasse nicht erwünscht, dann können statt dessen statische anonyme Funktionen verwendet werden.

Statische anonyme Funktionen

Ab PHP 5.4 können anonyme Funktionen statisch deklariert werden. Dies verhindert, dass automatisch die aktuelle Klasse an sie gebunden wird. Objekte können zur Laufzeit ebenfalls nicht an sie gebunden werden.

Beispiel #6 Versuch der Verwendung von $this innerhalb einer statischen anonymen Funktion

<?php

class Foo
{
    function 
__construct()
    {
        
$func = static function() {
            
var_dump($this);
        };
        
$func();
    }
};
new 
Foo();

?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Notice: Undefined variable: this in %s on line %d
NULL

Beispiel #7 Versuch ein Objekt an eine statische anonyme Funktion zu binden

<?php

$func 
= static function() {
    
// function body
};
$func $func->bindTo(new StdClass);
$func();

?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Warning: Cannot bind an instance to a static closure in %s on line %d

Erste Seite von PHP-Handbuch Inhaltsverzeichnis Haut

Changelog

Version Beschreibung
7.1.0 Anonyme Funktionen dürfen superglobals, $this und alle Variablen mit dem gleichen Namen wie Parameter nicht als freie Variablen verwenden.
5.4.0 Anonyme Funktionen können sowohl $this verwenden als auch statisch deklariert werden.
5.3.0 Anonyme Funktionen wurde eingeführt.

Erste Seite von PHP-Handbuch Inhaltsverzeichnis Haut

Anmerkungen

Hinweis: Es ist möglich func_num_args(), func_get_arg() und func_get_args() innerhalb einer Closure zu verwenden.

Finde eine PHP-Funktion

Deutsche Übersetzung

Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.

Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.

Vielen Dank im Voraus.

Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-functions.anonymous.html

Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.

Referenzen

  1. Zeigen Sie - html-Dokument Sprache des Dokuments:fr Manuel PHP : http://php.net

Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.

Inhaltsverzeichnis Haut