Sintaxa apelabilă de primă clasă este introdusă începând cu PHP 8.1.0, ca o modalitate de a crea funcții anonime din apelabile. Acesta înlocuiește sintaxa apelabilă existentă folosind șiruri de caractere și matrice. Avantajul acestei sintaxe este că este accesibilă analizei statice și utilizează domeniul de aplicare în punctul în care este achiziționat apelabilul.
Sintaxa CallableExpr(...)
este folosită pentru a crea un obiect Closure din apelabil. CallableExpr
acceptă orice expresie care poate fi apelată direct în gramatica PHP:
Exemplul #1 Sintaxă apelabilă simplă de primă clasă
<?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(...);
// obiect invocabil
$f3
=
$obj->method(...);
$f4
=
$obj->$methodStr(...);
$f5
=
Foo::staticmethod(...);
$f6
=
$classStr::$staticmethodStr(...);
// apelabil tradițional folosind
șir, matrice
$f7
=
'strlen'(...);
$f8
= [$obj,
'method'](...);
$f9
= [Foo::class,
'staticmethod'](...);
?>
Nota: ...
face parte din sintaxă, și nu este o omisiune.
CallableExpr(...)
are aceeași semantică le fel ca Closure::fromCallable(). Adică, spre deosebire de apelabil folosind șiruri și matrice, CallableExpr(...)
respectă domeniul de aplicare în punctul în care este creat:
Exemplul #2 Comparația domeniului
și apelabilul tradițional
CallableExpr(...)
<?php
class
Foo
{
public function getPrivateMethod()
{
return [$this,
'privateMethod'];
}
private function privateMethod()
{
echo __METHOD__,
"\n";
}
}
$foo
= new
Foo;
$privateMethod
=
$foo->getPrivateMethod();
$privateMethod();
// Eroare fatală: apel la metoda
privată Foo::privateMethod() din domeniul global
// Acest lucru se datorează faptului că apelul este efectuat în
afara de la Foo și vizibilitatea va fi verificată din acest punct.
class
Foo1
{
public function getPrivateMethod()
{
// Utilizează domeniul în care
este luat apelabilul.
return
$this->privateMethod(...);
// identic cu
Closure::fromCallable([$this, 'privateMethod']);
}
private function privateMethod()
{
echo __METHOD__,
"\n";
}
}
$foo1
= new
Foo1;
$privateMethod
=
$foo1->getPrivateMethod();
$privateMethod();
// Foo1::privateMethod
?>
Nota: Crearea de obiecte prin această sintaxă (de exemplu, new Foo(...)
) nu este acceptată, deoarece sintaxa new Foo()
nu este considerată un apel.
Nota: Sintaxa apelabilă de primă clasă nu poate fi combinată cu operatorul nullsafe. Ambele următoarele duc la o eroare la timp de compilare:
<?php
$obj?->method(...);
$obj?->prop->method(...);
?>
Sursa: PHP Manual, licența CC BY 3.0. Traducere și adaptare: Nicolae Sfetcu
Lasă un răspuns