Skip to content
This repository has been archived by the owner on Dec 10, 2019. It is now read-only.

Commit

Permalink
Merge branch 'release/1.0.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
Vitaliy Khomenko committed May 13, 2016
2 parents bb01941 + a469473 commit d71e32d
Show file tree
Hide file tree
Showing 10 changed files with 432 additions and 318 deletions.
124 changes: 61 additions & 63 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ class DeepThought
{
protected $answer;

public function getAnswer()
public function getAnswer ()
{
if ($this->answer === null) {
if ( $this->answer === null ) {
$this->answer = 42;
}

Expand All @@ -32,11 +32,11 @@ class DeepThought
{
use \iiifx\LazyInit\LazyInitTrait;

public function getAnswer()
public function getAnswer ()
{
return $this->lazyInit(function () {
return $this->lazyInit( function () {
return 42;
});
} );
}
}

Expand All @@ -49,29 +49,29 @@ echo $deepThought->getAnswer(); # 42
Используя Composer:

``` bash
$ composer require "iiifx-production/lazy-init:0.3.*"
$ composer require "iiifx-production/lazy-init:1.*"
```

## Использование

LazyInitTrait содержит метод lazyInit() и свойство $lazyInitData, в котором буферизирует результаты вычислений. Предназначен для использования в объектах в динамическом контексте.

``` php
mixed lazyInit( Closure $container, string $key = NULL, array $params = [] )
mixed lazyInit( Closure $container, string|array $dependency = null, array $params = [] )
```

- **$container** - Closure-контейнер, содержащий в себе вычисления, должен вернуть результат.
- **$key** - Ключ для сохранения результата вычисления, как правило используется `__METHOD__`. Если не указывать ключ, то он будет сгенерирован автоматически.
- **$dependency** - Строка, массив зависимостей или null - для сохранения результата вычисления. Если не указывать ключ, то он будет сгенерирован автоматически.
- **$params** - Дополнительные данные, которые будут переданы в Closure-контейнер при его запуске.

LazyInitStaticTrait содержит метод lazyInitStatic() и свойство $lazyInitStaticData, в котором буферизирует результаты вычислений. Предназначен для использования в статических классах в статическом контексте.

``` php
mixed lazyInitStatic( Closure $container, string $key = NULL, array $params = [] )
mixed lazyInitStatic( Closure $container, string|array $dependency = null, array $params = [] )
```
Параметры метода аналогичны.

Методы способны автоматически генерировать $key для буферизации данных основываясь на точке вызова в коде. Это реализуется с использованием функции [debug_backtrace()][link-debug-backtrace].
Методы способны автоматически генерировать ключ для буферизации данных основываясь на точке вызова в коде. Это реализуется с использованием функции [debug_backtrace()][link-debug-backtrace].

## Примеры

Expand All @@ -84,11 +84,11 @@ class Lazy
/**
* @return string
*/
public function getDate()
public function getDate ()
{
return $this->lazyInit(function () {
return date('d.m.Y');
}, __METHOD__);
return $this->lazyInit( function () {
return date( 'd.m.Y' );
}, __METHOD__ );
}
}

Expand All @@ -107,11 +107,11 @@ class Lazy
/**
* @return string
*/
public function getMicrotime()
public function getMicrotime ()
{
return $this->lazyInit(function () {
return microtime(true);
});
return $this->lazyInit( function () {
return microtime( true );
} );
}
}

Expand All @@ -132,29 +132,37 @@ class Lazy
*
* @return mixed[]
*/
public function parseString($string)
public function parseString ( $string )
{
return $this->lazyInit(function () use ($string) { # Передаем параметр в замыкание напрямую
return explode(':', $string);
}, __METHOD__.$string);
return $this->lazyInit( function () use ( $string ) { # Передаем параметр в замыкание напрямую
return explode( ':', $string );
}, [
__METHOD__,
$string,
] );
}

/**
* @param int $timastamp
*
* @return string
*/
public function formatTimastamp($timastamp)
public function formatTimastamp( $timastamp )
{
return $this->lazyInit(function ($t) {
return date('d.m.Y', $t);
}, __METHOD__.$timastamp, [$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'
var_export( $lazy->parseString( 'A:B:C' ) ); # [ 0 => 'A', 1 => 'B', 2 => 'C' ]
var_export( $lazy->formatTimastamp( time() ) ); # '12.07.2015'
```


Expand All @@ -168,11 +176,11 @@ class LazyStatic
/**
* @return string
*/
public static function getDate()
public static function getDate ()
{
return self::lazyInitStatic(function () {
return date('d.m.Y');
}, __METHOD__);
return self::lazyInitStatic( function () {
return date( 'd.m.Y' );
}, __METHOD__ );
}
}

Expand All @@ -185,14 +193,14 @@ echo LazyStatic::getDate(); # '12.07.2015'
``` php
use iiifx\LazyInit\LazyInitHelper;

function buildString($array)
function buildString( $array )
{
return LazyInitHelper::lazyInit(function ($v) {
return implode('.', $v);
}, 'build-string', [$array]);
return LazyInitHelper::lazyInit( function ($v) {
return implode( '.', $v );
}, 'build-string', [ $array ] );
}

echo buildString([1, 5, 32]); # '1.5.32'
echo buildString( [ 1, 5, 32 ] ); # '1.5.32'
```


Expand All @@ -203,24 +211,18 @@ class Singleton
{
use \iiifx\LazyInit\LazyInitStaticTrait;

private function __construct()
{
}
private function __clone()
{
}
private function __wakeup()
{
}
private function __construct () {}
private function __clone () {}
private function __wakeup () {}

/**
* @return static
*/
public static function getInstance()
public static function getInstance ()
{
return static::lazyInitStatic(function () {
return static::lazyInitStatic( function () {
return new static();
}, __METHOD__);
}, __METHOD__ );
}
}
$instance = Singleton::getInstance();
Expand All @@ -234,16 +236,12 @@ class Multiton
{
use \iiifx\LazyInit\LazyInitStaticTrait;

private function __clone()
{
}
private function __wakeup()
{
}
private function __clone () {}
private function __wakeup () {}

public $key;

protected function __construct($key)
protected function __construct ( $key )
{
$this->key = $key;
}
Expand All @@ -253,17 +251,17 @@ class Multiton
*
* @return static
*/
public static function getInstance($key)
public static function getInstance ( $key )
{
return static::lazyInitStatic(function ($key) {
return new static($key);
}, $key, [$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'
echo Multiton::getInstance( 'master' )->key; # 'master'
echo Multiton::getInstance( 'slave' )->key; # 'slave'
echo Multiton::getInstance( 'master' )->key; # 'master'
```

## Тесты
Expand Down
16 changes: 8 additions & 8 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
verbose="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
backupStaticAttributes="false"
colors="true"
verbose="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">

<testsuite name="Main Test Suite">
<directory>./</directory>
Expand Down
59 changes: 46 additions & 13 deletions source/LazyInitHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@
/**
* Class LazyInitHelper.
*
* @author Vitaliy IIIFX Khomenko <iiifx@yandex.com>
* @author Vitaliy IIIFX Khomenko <iiifx@yandex.com>
*
* @link https://github.com/iiifx-production/lazy-init
* @link https://github.com/iiifx-production/lazy-init
*/
class LazyInitHelper
{
use LazyInitStaticTrait;

/**
*
*/
const PART_SEPARATOR = '#';

/**
* @param Closure $closure
* @param string|null $key
Expand All @@ -25,30 +30,58 @@ class LazyInitHelper
*
* @throws ErrorException
*/
public static function lazyInit(Closure $closure, $key = null, $params = [])
public static function lazyInit ( Closure $closure, $key = null, array $params = [ ] )
{
if ($key === null) {
if ( $key === null ) {
$key = static::createBacktraceKey();
}

return static::lazyInitStatic($closure, $key, $params);
return static::lazyInitStatic( $closure, $key, $params );
}

/**
* @param int $backtraceDepth
*
* @return string
*
* @throws ErrorException
*/
public static function createBacktraceKey()
public static function createBacktraceKey ( $backtraceDepth = 3 )
{
return implode(
static::PART_SEPARATOR,
static::createBacktraceData( $backtraceDepth )
);
}

/**
* @param int $backtraceDepth
*
* @return array
*
* @throws ErrorException
*/
public static function createBacktraceData ( $backtraceDepth = 0 )
{
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
if (isset($backtrace[ 1 ][ 'file' ], $backtrace[ 1 ][ 'line' ])) {
$parts = [];
$parts[] = $backtrace[ 1 ][ 'file' ];
$parts[] = $backtrace[ 1 ][ 'line' ];
$backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, $backtraceDepth );
$backtraceKey = $backtraceDepth - 1;
if ( isset( $backtrace[ $backtraceKey ][ 'file' ], $backtrace[ $backtraceKey ][ 'line' ] ) ) {
$parts = [ ];
$parts[] = $backtrace[ $backtraceKey ][ 'file' ];
$parts[] = $backtrace[ $backtraceKey ][ 'line' ];

return md5(implode('#', $parts));
return $parts;
}
throw new ErrorException('Unable to create BacktraceKey.');
throw new ErrorException( 'Unable to create BacktraceData.' );
}

/**
* @param array $dependency
*
* @return string
*/
public static function createDependencyKey ( array $dependency )
{
return md5( serialize( $dependency ) );
}
}
Loading

0 comments on commit d71e32d

Please sign in to comment.