LazyInit
LazyInit - Ρ
Π΅Π»ΠΏΠ΅Ρ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π»Π΅Π½ΠΈΠ²ΠΎΠΉ(ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ) ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ., (*1)
, (*2)
, (*3)
ΠΡΠ»ΠΎΠΆΠ΅Π½Π½Π°Ρ (Π»Π΅Π½ΠΈΠ²Π°Ρ) ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (Lazy initialization) - ΠΏΡΠΈΡΠΌ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅ΡΡΡΡΠΎΡΠΌΠΊΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ) Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Β«ΠΏΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΒ», Π° Π½Π΅ Π·Π°Π±Π»Π°Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ., (*4)
ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
``` php
class DeepThought
{
protected $answer;, (*5)
public function getAnswer ()
{
if ( $this->answer === null ) {
$this->answer = 42;
}
return $this->answer;
}
}, (*6)
$deepThought = new DeepThought();
echo $deepThought->getAnswer(); # 42, (*7)
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ LazyInit:
``` php
class DeepThought
{
use \iiifx\LazyInit\LazyInitTrait;
public function getAnswer ()
{
return $this->lazyInit( function () {
return 42;
} );
}
}
$deepThought = new DeepThought();
echo $deepThought->getAnswer(); # 42
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Composer:, (*8)
``` bash
$ composer require "iiifx-production/lazy-init:1.*", (*9)
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
LazyInitTrait ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ lazyInit() ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ $lazyInitData, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΡΠ΅ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅.
``` php
mixed lazyInit( Closure $container, string|array $dependency = null, array $params = [] )
-
$container - Closure-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π² ΡΠ΅Π±Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΠ½ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
-
$dependency - Π‘ΡΡΠΎΠΊΠ°, ΠΌΠ°ΡΡΠΈΠ² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈΠ»ΠΈ null - Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠ»ΡΡ, ΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
-
$params - ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² Closure-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΏΡΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅.
LazyInitStaticTrait ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ lazyInitStatic() ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ $lazyInitStaticData, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΡΠ΅ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΊΠ»Π°ΡΡΠ°Ρ
Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅., (*10)
``` php
mixed lazyInitStatic( Closure $container, string|array $dependency = null, array $params = [] ), (*11)
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Ρ.
ΠΠ΅ΡΠΎΠ΄Ρ ΡΠΏΠΎΡΠΎΠ±Π½Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ
ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° ΡΠΎΡΠΊΠ΅ Π²ΡΠ·ΠΎΠ²Π° Π² ΠΊΠΎΠ΄Π΅. ΠΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ [debug_backtrace()][link-debug-backtrace].
## ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΠΎΡΡΠΎΠΉ Π³Π΅ΡΡΠ΅Ρ:
``` php
class Lazy
{
use \iiifx\LazyInit\LazyInitTrait;
/**
* @return string
*/
public function getDate ()
{
return $this->lazyInit( function () {
return date( 'd.m.Y' );
}, __METHOD__ );
}
}
$lazy = new Lazy();
echo $lazy->getDate(); # '12.07.2015'
ΠΡΠΎΡΡΠΎΠΉ Π³Π΅ΡΡΠ΅Ρ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ°:
``` php
class Lazy
{
use \iiifx\LazyInit\LazyInitTrait;, (*12)
/**
* @return string
*/
public function getMicrotime ()
{
return $this->lazyInit( function () {
return microtime( true );
} );
}
}, (*13)
$lazy = new Lazy();
echo $lazy->getMicrotime(); # 1438928722.9734, (*14)
ΠΠ΅ΡΡΠ΅ΡΡ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ ΠΎΡ Π²Ρ
ΠΎΠ΄ΡΡΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ:
``` php
class Lazy
{
use \iiifx\LazyInit\LazyInitTrait;
/**
* @param string $string
*
* @return mixed[]
*/
public function parseString ( $string )
{
return $this->lazyInit( function () use ( $string ) { # ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ
return explode( ':', $string );
}, [
__METHOD__,
$string,
] );
}
/**
* @param int $timastamp
*
* @return string
*/
public function formatTimastamp( $timastamp )
{
return $this->lazyInit( function ( $t ) {
return date( 'd.m.Y', $t );
}, [
__METHOD__,
$timastamp,
], [
$timastamp # ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
] );
}
}
$lazy = new Lazy();
var_export( $lazy->parseString( 'A:B:C' ) ); # [ 0 => 'A', 1 => 'B', 2 => 'C' ]
var_export( $lazy->formatTimastamp( time() ) ); # '12.07.2015'
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
:
``` php
class LazyStatic
{
use \iiifx\LazyInit\LazyInitStaticTrait;, (*15)
/**
* @return string
*/
public static function getDate ()
{
return self::lazyInitStatic( function () {
return date( 'd.m.Y' );
}, __METHOD__ );
}
}, (*16)
echo LazyStatic::getDate(); # '12.07.2015', (*17)
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ
Π΅Π»ΠΏΠ΅ΡΠ° Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠΎΠ²:
``` php
use iiifx\LazyInit\LazyInitHelper;
function buildString( $array )
{
return LazyInitHelper::lazyInit( function ($v) {
return implode( '.', $v );
}, 'build-string', [ $array ] );
}
echo buildString( [ 1, 5, 32 ] ); # '1.5.32'
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΠΈ(Singleton):
``` php
class Singleton
{
use \iiifx\LazyInit\LazyInitStaticTrait;, (*18)
private function __construct () {}
private function __clone () {}
private function __wakeup () {}
/**
* @return static
*/
public static function getInstance ()
{
return static::lazyInitStatic( function () {
return new static();
}, __METHOD__ );
}
}
$instance = Singleton::getInstance();, (*19)
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π° ΠΎΠ΄ΠΈΠ½ΠΎΡΠ΅ΠΊ([Multiton][link-wikipedia-multiton]):
``` php
class Multiton
{
use \iiifx\LazyInit\LazyInitStaticTrait;
private function __clone () {}
private function __wakeup () {}
public $key;
protected function __construct ( $key )
{
$this->key = $key;
}
/**
* @param string $key
*
* @return static
*/
public static function getInstance ( $key )
{
return static::lazyInitStatic( function ( $key ) {
return new static( $key );
}, $key, [ $key ] );
}
}
echo Multiton::getInstance( 'master' )->key; # 'master'
echo Multiton::getInstance( 'slave' )->key; # 'slave'
echo Multiton::getInstance( 'master' )->key; # 'master'
Π’Π΅ΡΡΡ
[
][link-scrutinizer], (*20)
ΠΠΈΡΠ΅Π½Π·ΠΈΡ
, (*21)