π ΠΠΎΠ΅-ΡΡΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠ±Β Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ PHP
ΠΠ΅ΠΊ ΠΆΠΈΠ²ΠΈ, Π²Π΅ΠΊ ΡΡΠΈΡΡ. ΠΠ°ΠΆΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π΅Β ΠΈΠ·Π±Π°Π²Π»ΡΠ΅Ρ ΠΎΡΒ Π΄ΡΡ Π²Β Π΅Ρ Π·Π½Π°Π½ΠΈΠΈ, ΡΡΠΎΠΈΡ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎ-Π΄Π²Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΒ Π½Π΅Β ΡΠ·Π½Π°Π΅ΡΡ ΠΎΒ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ. Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠ» Π²Β Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π»ΡΠ±ΠΎΠΏΡΡΠ½ΠΎΠ΅ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ². ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π°Β ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΈΠΆΠ΅:
class Tester
{
Β Β Β Β public function returnFunc()
Β Β Β Β {
Β Β Β Β Β Β Β Β return function() {
Β Β Β Β Β Β Β Β Β Β Β Β return "Function call.\n";
Β Β Β Β Β Β Β Β };
Β Β Β Β }
Β Β Β Β public function returnStaticFunc()
Β Β Β Β {
Β Β Β Β Β Β Β Β return static function() {
Β Β Β Β Β Β Β Β Β Β Β Β return "Static function call.\n";
Β Β Β Β Β Β Β Β };
Β Β Β Β }
Β Β Β Β public function __destruct()
Β Β Β Β {
Β Β Β Β Β Β Β Β echo "Tester died.\n";
Β Β Β Β }
}
$holder = (new Tester)->returnFunc();
gc_collect_cycles();
echo $holder(); // Β«Function call.Β»
unset($holder);
$holderStatic = (new Tester)->returnStaticFunc();
gc_collect_cycles(); // Π΄Π²Π°ΠΆΠ΄Ρ Β«Tester diedΒ»
echo $holderStatic(); // Β«Static function call.Β»
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π°Β ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Β«return staticΒ». ΠΠ΅Π»ΠΎ Π²Β ΡΠΎΠΌ, ΡΡΠΎ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Β ΠΠ₯Π, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π²Β ΠΌΠ΅ΡΠΎΠ΄Π΅, Π½Π΅ΡΠ²Π½ΠΎ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΡΠΎ Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $this. ΠΒ ΡΡΠΎΠΌ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π±Π΅Π΄Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎΡΠΎΡΠΊΠΎΠΆΠΈΠ²ΡΡΡΠ°Ρ.
ΠΒ ΠΌΠΎΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄ΡΡΠ³Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡΒ β ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π½ΠΎΒ ΡΠ°ΠΌ ΠΎΠ½ ΡΠΆΠ΅ Π½Π΅Β Π½ΡΠΆΠ΅Π½. ΠΠΎΠ³ΠΈΡΠ½ΠΎ Π±ΡΠ»ΠΎΒ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ Π΅Π³ΠΎ ΠΏΡΠΈΒ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ±ΡΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ° (ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ gc_collect_cycles), Π½ΠΎΒ Π½Π΅Ρ. Π‘ΡΡΠ»ΠΊΠ° Π½Π°Β Π½Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π²Β Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΆΠ΄ΡΠ½Π½ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ returnFunc, ΠΠ₯Π ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΈΒ ΠΏΠΎΠ½ΡΡΠΈΡ Π½Π΅Β ΠΈΠΌΠ΅Π΅Ρ Π½ΡΠΆΠ΅Π½Β Π»ΠΈ Π±ΡΠ΄Π΅Ρ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π΅Π³ΠΎ Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ Π²Π½ΡΡΡΠΈ Π½Π°Β Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠΎΒ Π²ΡΠΎΡΠΎΠΌ ΠΏΠΎΠ΄ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Β«static functionΒ» Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΡ, ΡΡΠΎ Π²Β ΡΡΡΠ»ΠΊΠ΅ Π½Π°Β ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΡ Π½Π΅Β Π½ΡΠΆΠ΄Π°Π΅ΠΌΡΡ, ΠΏΠΎΡΠΎΠΌΡ Π²ΡΠ·ΠΎΠ² gc_collect_cycles ΡΠ±ΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ°Β β ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ΄ΠΏΡΠΈΠΌΠ΅ΡΠ° (ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ $holder ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Π°), ΡΠ°ΠΊ ΠΈΒ ΠΈΠ·Β ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠ°Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅Β ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΡ Π½Π°Β ΠΎΠ±ΡΠ΅ΠΊΡ.
Π§ΡΠΎ-ΡΠΎ Π½Π΅Β ΡΡΠ΄Π° ΠΈΠ΄ΡΡ, ΠΌΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ.
Π Π°Π½ΡΡΠ΅, Π΅ΡΠ»ΠΈ Ρ Π½Π΅Β ΠΎΡΠΈΠ±Π°ΡΡΡ, Π²Β PHP Π±ΡΠ» ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΒ with Π΄Π»ΡΒ Π»ΡΠΌΠ±Π΄ ΠΈΒ Π²ΡΡ Π±ΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠΎ.
ΠΒ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ, Π°Π»Ρ ΠΊΠ»Π°ΡΡΡ-Π΄ΡΡΠ·ΡΡ, Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π½Π΅Β Π½ΡΠΆΠ½ΠΎΠ΅.
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π΄Π»ΡΒ SowingSadness:
Π§ΡΠΎ Π·Π°Β ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ with Π΄Π»ΡΒ Π»ΡΠΌΠ±Π΄? ΠΡΠΌΠ±Π΄ Π²Β PHP ΡΠ°Π½ΡΡΠ΅ Π½Π΅Β Π±ΡΠ»ΠΎ. ΠΒ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ, ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΠΎΠ½ΠΈ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎΒ static.