ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π·Π½Π°ΡΡ ΠΊΠ°ΠΊ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ (closures), β
ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π΅Π· Π½Π°Π·Π²Π°Π½ΠΈΡ.
ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Ρ ΡΠΈΠΏΠΎΠΌ callable.
PHP ΡΠΎΠ·Π΄Π°ΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΊΠ»Π°ΡΡ
Closure.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
<?php
echo preg_replace_callback(
'~-([a-z])~',
function ($match) {
return strtoupper($match[1]);
},
'hello-world'
);
// ΠΡΠ²Π΅Π΄Π΅Ρ helloWorld
ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ; PHP Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°
Closure.
ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ,
ΡΡΠΎ ΠΈ Π΄Π»Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Ρ Π·Π°ΠΏΡΡΠΎΠΉ:
ΠΡΠΈΠΌΠ΅Ρ #2
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
<?php
$greet = function($name) {
printf("ΠΡΠΈΠ²Π΅Ρ, %s\r\n", $name);
};
$greet('ΠΠΈΡ');
$greet('PHP');
ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ ΡΠΌΠ΅ΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ· ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ
ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠ»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ°ΠΊΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΠ·ΡΠΊΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ use.
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 7.1 Π½Π΅Π»ΡΠ·Ρ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡ Ρ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ΠΌ superglobals,
ΠΏΡΠ΅Π²Π΄ΠΎΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $this ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ
ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°
ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ use.
ΠΡΠΈΠΌΠ΅Ρ #3
ΠΡΠΈΠΌΠ΅Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΈΠ· ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
<?php
$message = 'ΠΏΡΠΈΠ²Π΅Ρ';
// ΠΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ use
$example = function () {
var_dump($message);
};
$example();
// ΠΠ°ΡΠ»Π΅Π΄ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $message
$example = function () use ($message) {
var_dump($message);
};
$example();
// ΠΠ½ΠΎΠ½ΠΈΠΌΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
// ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»Π° ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π½Π΅ Π² ΠΌΠ΅ΡΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ
$message = 'ΠΌΠΈΡ';
$example();
// Π‘Π±ΡΠΎΡΠΈΠΌ message
$message = 'ΠΏΡΠΈΠ²Π΅Ρ';
// ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅
$example = function () use (&$message) {
var_dump($message);
};
$example();
// ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ,
// ΠΎΡΡΠ°ΠΆΠ°Π΅ΡΡΡ Π²Π½ΡΡΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ
$message = 'ΠΌΠΈΡ';
$example();
// ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ ΡΠΌΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
$example = function ($arg) use ($message) {
var_dump($arg . ', ' . $message);
};
$example("ΠΏΡΠΈΠ²Π΅Ρ");
// ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ΄ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ use
$example = function () use ($message): string {
return "ΠΏΡΠΈΠ²Π΅Ρ, $message";
};
var_dump($example());
ΠΡΠ²ΠΎΠ΄ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡ
ΠΎΠΆ Π½Π°:
Notice: Undefined variable: message in /example.php on line 6
NULL
string(12) "ΠΏΡΠΈΠ²Π΅Ρ"
string(12) "ΠΏΡΠΈΠ²Π΅Ρ"
string(12) "ΠΏΡΠΈΠ²Π΅Ρ"
string(6) "ΠΌΠΈΡ"
string(20) "ΠΏΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ"
string(20) "ΠΏΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ"
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.0.0 ΡΠΏΠΈΡΠΊΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ
Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ Π·Π°ΠΏΡΡΡΡ,
ΠΊΠΎΡΠΎΡΡΡ ΠΏΠ°ΡΡΠ΅Ρ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ.
ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΈΠ· ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
.
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ,
ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΡΠ°ΡΡΡΡ ΠΏΡΠ΅ΠΆΠ½Π΅ΠΉ, ΠΊΠ°ΠΊΠ°Ρ Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ.
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ β
ΡΡΠ½ΠΊΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ±ΡΡΠ²ΠΈΠ»ΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅; Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ
ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π²ΡΠ·Π²Π°Π»ΠΈ. Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ
ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΡΠΈΠΌΠ΅Ρ #4 ΠΠ°ΠΌΡΠΊΠ°Π½ΠΈΡ ΠΈ ΠΎΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
<?php
// ΠΠ°Π·ΠΎΠ²Π°Ρ ΠΊΠΎΡΠ·ΠΈΠ½Π° ΠΏΠΎΠΊΡΠΏΠΎΠΊ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΏΠΈΡΠΎΠΊ
// ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°. ΠΠΊΠ»ΡΡΠ°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄,
// ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΎΠ±ΡΡΡ ΡΠ΅Π½Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΡΠ·ΠΈΠ½Ρ ΡΠ΅ΡΠ΅Π·
// callback-Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅
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($total, 2);
}
}
$my_cart = new Cart;
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΊΠΎΡΠ·ΠΈΠ½Ρ
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);
// ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΠ±ΡΡΡ ΡΡΠΌΠΌΡ Ρ Π½Π°Π»ΠΎΠ³ΠΎΠΌ 5 % Π½Π° ΠΏΡΠΎΠ΄Π°ΠΆΡ
print $my_cart->getTotal(0.05) . "\n";
// Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ 54.29
ΠΡΠΈΠΌΠ΅Ρ #5 ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $this
<?php
class Test
{
public function testing()
{
return function () {
var_dump($this);
};
}
}
$object = new Test();
$function = $object->testing();
$function();
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ
ΠΊΠ»Π°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ, Π° ΡΠ»Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $this Π² ΠΎΠ±Π»Π°ΡΡΠΈ
Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ,
ΠΊΠΎΠ³Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΊΠ»Π°ΡΡΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ.
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ
Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΠ±ΡΠ΅ΠΊΡΡ ΡΠΎΠΆΠ΅ Π½Π΅ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ΠΌ
Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°.
ΠΡΠΈΠΌΠ΅Ρ #6
ΠΠΎΠΏΡΡΠΊΠ° ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ $this
Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
<?php
class Foo
{
function __construct()
{
$func = static function () {
var_dump($this);
};
$func();
}
};
new Foo();
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Fatal error: Uncaught Error: Using $this when not in object context in script:7
Stack trace:
#0 script(9): Foo::{closure:Foo::__construct():6}()
#1 script(12): Foo->__construct()
#2 {main}
thrown in script on line 7
ΠΡΠΈΠΌΠ΅Ρ #7
ΠΠΎΠΏΡΡΠΊΠ° ΡΠ²ΡΠ·Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
<?php
$func = static function () {
// Π’Π΅Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ
};
$func = $func->bindTo(new stdClass());
$func();
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Warning: Cannot bind an instance to a static closure, this will be an error in PHP 9 in script on line 5
Fatal error: Uncaught Error: Value of type null is not callable in script:6
Stack trace:
#0 {main}
thrown in script on line 6
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ