|
Server : LiteSpeed System : Linux srv526460274 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : kerao9884 ( 1082) PHP Version : 8.0.30 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /home/kera789.org/public_html/wp-content/plugins/amp/src/Infrastructure/Injector/ |
Upload File : |
<?php
/**
* Final class InjectionChain.
*
* @package AmpProject\AmpWP
*/
namespace AmpProject\AmpWP\Infrastructure\Injector;
use LogicException;
/**
* The injection chain is similar to a trace, keeping track of what we have done
* so far and at what depth within the auto-wiring we currently are.
*
* It is used to detect circular dependencies, and can also be dumped for
* debugging information.
*
* @since 2.0
* @internal
*/
final class InjectionChain {
/** @var array<string> */
private $chain = [];
/** @var array<bool> */
private $resolutions = [];
/**
* Add class to injection chain.
*
* @param string $class Class to add to injection chain.
* @return self Modified injection chain.
*/
public function add_to_chain( $class ) {
$new_chain = clone $this;
$new_chain->chain[] = $class;
return $new_chain;
}
/**
* Add resolution for circular reference detection.
*
* @param string $resolution Resolution to add.
* @return self Modified injection chain.
*/
public function add_resolution( $resolution ) {
$new_chain = clone $this;
$new_chain->resolutions[ $resolution ] = true;
return $new_chain;
}
/**
* Get the last class that was pushed to the injection chain.
*
* @return string Last class pushed to the injection chain.
* @throws LogicException If the injection chain is accessed too early.
*/
public function get_class() {
if ( empty( $this->chain ) ) {
throw new LogicException(
'Access to injection chain before any resolution was made.'
);
}
return \end( $this->chain ) ?: '';
}
/**
* Get the injection chain.
*
* @return array Chain of injections.
*/
public function get_chain() {
return \array_reverse( $this->chain );
}
/**
* Check whether the injection chain already has a given resolution.
*
* @param string $resolution Resolution to check for.
* @return bool Whether the resolution was found.
*/
public function has_resolution( $resolution ) {
return \array_key_exists( $resolution, $this->resolutions );
}
/**
* Check whether the injection chain already encountered a class.
*
* @param string $class Class to check.
* @return bool Whether the given class is already part of the chain.
*/
public function is_in_chain( $class ) {
return in_array( $class, $this->chain, true );
}
}