This class simply provides a way to define fluent chain of method calls before having the instance you wan't to applty it to. Once the expected instance is available, simply call the chain on it.
php-deferred-callchain is installable via Composer
composer require jclaveau/php-deferred-callchain
$nameRobert = DeferredCallChain::new_()
->setName('Muda')
->setFirstName('Robert')
;
$mySubjectIMissedBefore = new Human;
$robert = $nameRobert( $mySubjectIMissedBefore );
echo $robert->getFullName(); // => "Robert Muda"
echo (string) $nameRobert; // => "(new JClaveau\Async\DeferredCallChain)->setName('Muda')->setFirstName('Robert')"
$nameRobert = DeferredCallChain::new_("Alien")
->setName('Muda')
->setFirstName('Robert')
;
$mySubjectIMissedBefore = new Human;
$robert = $nameRobert( $mySubjectIMissedBefore );
// throws BadTargetClassException
$getCount = (new DeferredCallChain("\Traversable"))
->count()
;
$myCountableIMissedBefore = new CountableClass; // class implementing Countable
// throws BadTargetInterfaceException
$nameRobert = DeferredCallChain::new_("array")
->setName('Muda')
->setFirstName('Robert')
;
$mySubjectIMissedBefore = new Human;
$robert = $nameRobert( $mySubjectIMissedBefore );
// throws BadTargetTypeException
$myTarget = new Human;
$nameRobert = DeferredCallChain::new_($myTarget)
->setName('Muda')
->setFirstName('Robert')
;
$robert = $nameRobert( new Human );
// throws TargetAlreadyDefinedException
$getSubColumnValue = (new DeferredCallChain)
['column_1']
['sub_column_3']
;
$sub_column_3_value = $getSubColumnValue( [
'column_1' => [
'sub_column_1' => 'lalala',
'sub_column_2' => 'lololo',
'sub_column_3' => 'lilili',
],
'column_2' => [
'sub_column_1' => 'lululu',
'sub_column_2' => 'lelele',
'sub_column_3' => 'lylyly',
],
] );
echo $sub_column_3_value; // => "lilili"
echo (string) $getSubColumnValue; // => "(new JClaveau\Async\DeferredCallChain)['column_1']['sub_column_3']"