Första klassens kallbara syntax

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

First class callable syntax

Den nya first class callable-syntaxen introducerades i PHP 8.1.0 som ett sätt att skapa anonyma funktioner från callable. Den ersätter den befintliga callable-syntaxen som använder strängar och arrayer. Fördelen med denna syntax är att den är tillgänglig för statisk analys och använder omfånget vid den tidpunkt då callable skapas.

Syntaxen `CallableExpr(...)` används för att skapa ett Closure-objekt från callable. `CallableExpr` accepterar alla uttryck som kan anropas direkt i PHP-syntaxen:

Exempel #1 Enkel first class callable syntax

<?php

class Foo {
   public function method() {}
   public static function staticmethod() {}
   public function __invoke() {}
}

$obj = new Foo();
$classStr = 'Foo';
$methodStr = 'method';
$staticmethodStr = 'staticmethod';


$f1 = strlen(...);
$f2 = $obj(...);  // invokerbart objekt
$f3 = $obj->method(...);
$f4 = $obj->$methodStr(...);
$f5 = Foo::staticmethod(...);
$f6 = $classStr::$staticmethodStr(...);

// traditionell callable som använder sträng, array
$f7 = 'strlen'(...);
$f8 = [$obj, 'method'](...);
$f9 = [Foo::class, 'staticmethod'](...);
?>

Notera:

... är en del av syntaxen, och inte en utelämning.

`CallableExpr(...)` har samma semantik som `Closure::fromCallable()`. Det vill säga, till skillnad från callable som använder strängar och arrayer, respekterar `CallableExpr(...)` omfånget vid den tidpunkt då det skapas:

Exempel #2 Jämförelse av omfång mellan `CallableExpr(...)` och traditionell callable

<?php

class Foo {
    public function getPrivateMethod() {
        return [$this, 'privateMethod'];
    }

    private function privateMethod() {
        echo __METHOD__, "\n";
    }
}

$foo = new Foo;
$privateMethod = $foo->getPrivateMethod();
$privateMethod();
// Fatal error: Anrop till privat metod Foo::privateMethod() från globalt omfång
// Detta beror på att anropet utförs utanför Foo och synligheten kommer att kontrolleras från denna punkt.

class Foo1 {
    public function getPrivateMethod() {
        // Använder omfånget där callable skapas.
        return $this->privateMethod(...); // identiskt med Closure::fromCallable([$this, 'privateMethod']);
    }

    private function privateMethod() {
        echo __METHOD__, "\n";
    }
}

$foo1 = new Foo1;
$privateMethod = $foo1->getPrivateMethod();
$privateMethod();  // Foo1::privateMethod
?>

Notera:

Objektskapande med denna syntax (t.ex. `new Foo(...)`) stöds inte, eftersom `new Foo()`-syntaxen inte betraktas som ett anrop.

Notera:

Den first-class callable-syntaxen kan inte kombineras med nullsafe-operatorn. Båda följande exempel resulterar i ett kompileringsfel:

<?php
$obj?->method(...);
$obj?->prop->method(...);
?>

Sidslut

Orginalhemsidan på Engelska :
PHP
Språkreferens
Språkreferens#Funktioner