├── .gitignore ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── src ├── class-dic.php ├── class-league-container-dic.php └── class-wp-dich.php └── vendor ├── autoload.php ├── composer ├── ClassLoader.php ├── LICENSE ├── autoload_classmap.php ├── autoload_namespaces.php ├── autoload_psr4.php ├── autoload_real.php ├── autoload_static.php └── installed.json └── psr └── container ├── .gitignore ├── LICENSE ├── README.md ├── composer.json └── src ├── ContainerExceptionInterface.php ├── ContainerInterface.php └── NotFoundExceptionInterface.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .idea/* 3 | 4 | **/.sass-cache 5 | **/.sass-cache/* 6 | node_modules 7 | node_modules/* 8 | package-lock.json 9 | 10 | **/*.log -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Thanks to IT 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WP_DICH 2 | **WP_DICH** offers a way to work with WordPress hooks smartly using a Dependency Injection Container, allowing lazy loading, making classes to be loaded only when required. 3 | 4 | ## The Challenge 5 | Let's suppose you simply want to call a method `method_a()` from a class `Any_Class` only when a specific WordPress hook is run. How would you do it? There are at least 3 ways that come to my mind: 6 | 7 | 1. ### :-1: Object Method Call 8 | The problem here is you are initializing `Any_Class()` before it's necessary, as you only need the method on `wp_footer` hook. 9 | ```php 10 | class Any_Class{ 11 | public function method_a(){} 12 | } 13 | $any_class = new Any_Class(); 14 | add_action( 'wp_footer', array( $any_class, 'method_a') ); 15 | ``` 16 | 17 | 2. ### :-1: Using Anonymous Functions 18 | The disadvantage here is you're not able to remove the action with `remove_action()` 19 | ```php 20 | class Any_Class{ 21 | public function method_a(){} 22 | } 23 | add_action( 'wp_footer', function(){ 24 | $any_class = new Any_Class(); 25 | $any_class->method_a(); 26 | }); 27 | ``` 28 | 29 | 3. ### :-1: Using Static Methods 30 | With the Static Methods approach, at least your class is loaded at the proper time, but quite often, from a design standpoint, it's better to stick to non-static methods. You can't override them, they are more difficult to test and you end up having to design other things around it as static too. 31 | ```php 32 | class Any_Class{ 33 | public static function method_a(){} 34 | } 35 | add_action( 'wp_footer', array('Any_Class', 'method_a') ); 36 | ``` 37 | 38 | 39 | --- 40 | 41 | 42 | ### :ok_hand: The WP_DICH Solution 43 | **WP_DICH** combines the advantage of the Object Method Call, using a non static method, with the benefits of loading the class only when it's required. Check how it's simple: 44 | 45 | First you need to pass a Dependency Injection Container Interface to `WP_DICH()`. 46 | ```php 47 | $dic = new \Thanks_To_IT\WP_DICH\DIC(); 48 | $dich = new \Thanks_To_IT\WP_DICH\WP_DICH( $dic ); 49 | ``` 50 | > WP_DICH already offers a small Dependency Injection Container, thanks to [Carl Alexander](https://carlalexander.ca/dependency-injection-wordpress/), but you can use any library you want, like [thephpleague/container](https://github.com/thephpleague/container) or [php-di](http://php-di.org/) for example. You just have to implement a `Psr\Container\ContainerInterface` with 2 methods, `get()` and `has()` 51 | 52 | Then you just have to setup your container as you like: 53 | ```php 54 | $dic['any_class_alias'] = function () { 55 | return new Any_Class(); 56 | }; 57 | ``` 58 | 59 | Now if you create your hook using the class alias you've configured on the container as the first parameter of the array, instead of calling a static method, it will load your class only when `wp_footer` hook is run and then `method_a` will be called. 60 | ```php 61 | $dich->add_action( 'wp_footer', array( 'any_class_alias', 'method_a') ); 62 | ``` 63 | 64 | ## WP_DICH hooks 65 | You can use the WordPress hook functions you are used to, like: 66 | 67 | - `$dich->add_action` 68 | - `$dich->add_filter` 69 | - `$dich->remove_action` 70 | - `$dich->remove_filter` 71 | 72 | ## Services 73 | As we are using a Dependency Injection Container Library we may benefit from some interesting features, like services, allowing to instantiate your classes only once. Yes, no need to think about Singletons anymore. 74 | 75 | ```php 76 | $dic['any_class_alias'] = $dic->service( function () { 77 | return new Any_Class(); 78 | } ); 79 | ``` 80 | Now everytime you call for **'any_class_alias'** the same object will be returned instead of creating a new one every time. 81 | 82 | 83 | ## Installation 84 | **Composer** 85 | Add `thanks-to-it/wp-dich` to the require-dev or require section of your project's `composer.json` configuration file, and run 'composer install': 86 | ```json 87 | { 88 | "require": { 89 | "thanks-to-it/wp-dich":"dev-master" 90 | } 91 | } 92 | ``` 93 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "thanks-to-it/wp-dich", 3 | "config": { 4 | "optimize-autoloader": true 5 | }, 6 | "require": { 7 | "php": ">=5.6.0", 8 | "psr/container": "^1.0" 9 | }, 10 | "autoload": { 11 | "classmap": [ 12 | "src" 13 | ] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "aef2e425994c35f70da733d049d06366", 8 | "packages": [ 9 | { 10 | "name": "psr/container", 11 | "version": "1.0.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/php-fig/container.git", 15 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 20 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "type": "library", 27 | "extra": { 28 | "branch-alias": { 29 | "dev-master": "1.0.x-dev" 30 | } 31 | }, 32 | "autoload": { 33 | "psr-4": { 34 | "Psr\\Container\\": "src/" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "MIT" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "PHP-FIG", 44 | "homepage": "http://www.php-fig.org/" 45 | } 46 | ], 47 | "description": "Common Container Interface (PHP FIG PSR-11)", 48 | "homepage": "https://github.com/php-fig/container", 49 | "keywords": [ 50 | "PSR-11", 51 | "container", 52 | "container-interface", 53 | "container-interop", 54 | "psr" 55 | ], 56 | "time": "2017-02-14T16:28:37+00:00" 57 | } 58 | ], 59 | "packages-dev": [], 60 | "aliases": [], 61 | "minimum-stability": "stable", 62 | "stability-flags": [], 63 | "prefer-stable": false, 64 | "prefer-lowest": false, 65 | "platform": { 66 | "php": ">=5.6.0" 67 | }, 68 | "platform-dev": [] 69 | } 70 | -------------------------------------------------------------------------------- /src/class-dic.php: -------------------------------------------------------------------------------- 1 | values = $values; 43 | } 44 | 45 | /** 46 | * {@inheritdoc} 47 | */ 48 | public function get( $id ) { 49 | return $this[ $id ]; 50 | } 51 | 52 | /** 53 | * {@inheritdoc} 54 | */ 55 | function has( $id ) { 56 | return $this->offsetExists( $id ); 57 | } 58 | 59 | /** 60 | * Configure the container using the given container configuration objects. 61 | * 62 | * @version 1.0.0 63 | * @since 1.0.0 64 | * 65 | * @param array $configurations 66 | */ 67 | public function configure( array $configurations ) { 68 | foreach ( $configurations as $configuration ) { 69 | $configuration->modify( $this ); 70 | } 71 | } 72 | 73 | /** 74 | * Checks if there's a value in the container for the given key. 75 | * 76 | * @version 1.0.0 77 | * @since 1.0.0 78 | * 79 | * @param mixed $key 80 | * 81 | * @return bool 82 | */ 83 | public function offsetExists( $key ) { 84 | return array_key_exists( $key, $this->values ); 85 | } 86 | 87 | /** 88 | * Get a value from the container. 89 | * 90 | * @version 1.0.0 91 | * @since 1.0.0 92 | * 93 | * @param mixed $key 94 | * 95 | * @return mixed|WP_Error 96 | */ 97 | public function offsetGet( $key ) { 98 | if ( ! array_key_exists( $key, $this->values ) ) { 99 | return new \WP_Error( 'no_value_found', sprintf( 'Container doesn\'t have a value stored for the "%s" key.', $key ) ); 100 | } 101 | 102 | return $this->values[ $key ] instanceof \Closure ? $this->values[$key]( $this ) : $this->values[ $key ]; 103 | } 104 | 105 | /** 106 | * Sets a value inside of the container. 107 | * 108 | * @version 1.0.0 109 | * @since 1.0.0 110 | * 111 | * @version 1.0.0 112 | * @since 1.0.0 113 | * 114 | * @param mixed $key 115 | * @param mixed $value 116 | */ 117 | public function offsetSet( $key, $value ) { 118 | $this->values[ $key ] = $value; 119 | } 120 | 121 | /** 122 | * Unset the value in the container for the given key. 123 | * 124 | * @version 1.0.0 125 | * @since 1.0.0 126 | * 127 | * @param mixed $key 128 | */ 129 | public function offsetUnset( $key ) { 130 | unset( $this->values[ $key ] ); 131 | } 132 | 133 | /** 134 | * Creates a closure used for creating a service using the given callable. 135 | * 136 | * @version 1.0.0 137 | * @since 1.0.0 138 | * 139 | * @param \Closure $closure 140 | * 141 | * @return \Closure 142 | */ 143 | public function service( \Closure $closure ) { 144 | return function ( DIC $container ) use ( $closure ) { 145 | static $object; 146 | 147 | if ( null === $object ) { 148 | $object = $closure( $container ); 149 | } 150 | 151 | return $object; 152 | }; 153 | } 154 | } 155 | } -------------------------------------------------------------------------------- /src/class-league-container-dic.php: -------------------------------------------------------------------------------- 1 | di_container = $di_container; 35 | } 36 | 37 | /** 38 | * get_object_alias. 39 | * 40 | * @version 1.0.0 41 | * @since 1.0.0 42 | * 43 | * @param callable $function_to_add 44 | * 45 | * @return bool|mixed 46 | */ 47 | private function get_object_alias( $function_to_add ) { 48 | if ( 49 | ! is_array( $function_to_add ) || 50 | ! is_string( $function_to_add[0] ) || 51 | is_object( $function_to_add[0] ) 52 | ) { 53 | return false; 54 | } 55 | 56 | return $function_to_add[0]; 57 | } 58 | 59 | /** 60 | * get_function_to_add. 61 | * 62 | * @version 1.0.0 63 | * @since 1.0.0 64 | * 65 | * @param callable $callback 66 | * 67 | * @return array 68 | */ 69 | private function get_callback( $callback ) { 70 | $object_alias = $this->get_object_alias( $callback ); 71 | $final_function_to_add = $callback; 72 | if ( 73 | false !== $object_alias && 74 | $this->di_container->has( $object_alias ) 75 | ) { 76 | $object = $this->di_container->get( $object_alias ); 77 | $final_function_to_add = array( $object, $callback[1] ); 78 | } else { 79 | if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { 80 | if ( is_array( $callback ) && is_string( $callback[0] ) ) { 81 | error_log( sprintf( 'WP_DICH Container doesn\'t have a value stored for the "%s" key.', $object_alias ) ); 82 | } 83 | } 84 | } 85 | return $final_function_to_add; 86 | } 87 | 88 | /** 89 | * add_action. 90 | * 91 | * @version 1.0.0 92 | * @since 1.0.0 93 | * 94 | * @param $tag 95 | * @param callable $function_to_add 96 | * @param int $priority 97 | * @param int $accepted_args 98 | * 99 | */ 100 | public function add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { 101 | $this->remove_from_callbacks( $tag, $function_to_add, $priority ); 102 | add_action( $tag, function () use ( $tag, $function_to_add, $priority ) { 103 | if ( $this->need_to_remove( $function_to_add, $tag, $priority ) ) { 104 | return; 105 | } 106 | $function_to_add = $this->get_callback( $function_to_add ); 107 | call_user_func_array( $function_to_add, func_get_args() ); 108 | }, $priority, $accepted_args ); 109 | } 110 | 111 | /** 112 | * add_filter. 113 | * 114 | * @version 1.0.0 115 | * @since 1.0.0 116 | * 117 | * @param $tag 118 | * @param callable $function_to_add 119 | * @param int $priority 120 | * @param int $accepted_args 121 | * 122 | * @return \WP_Error|boolean 123 | */ 124 | public function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) { 125 | $this->remove_from_callbacks( $tag, $function_to_add, $priority ); 126 | return add_filter( $tag, function () use ( $tag, $function_to_add, $priority ) { 127 | if ( $this->need_to_remove( $function_to_add, $tag, $priority ) ) { 128 | return func_get_args()[0]; 129 | } 130 | $function_to_add = $this->get_callback( $function_to_add ); 131 | return call_user_func_array( $function_to_add, func_get_args() ); 132 | }, $priority, $accepted_args ); 133 | } 134 | 135 | /** 136 | * need_to_remove. 137 | * 138 | * @version 1.0.0 139 | * @since 1.0.0 140 | * 141 | * @param $function_to_add 142 | * @param $tag 143 | * 144 | * @param int $priority 145 | * 146 | * @return bool 147 | */ 148 | private function need_to_remove( $function_to_add, $tag, $priority = 10 ) { 149 | $function_to_add = $this->modify_callback_if_string( $function_to_add ); 150 | $function_to_add[] = $priority; 151 | return in_array( $function_to_add, $this->callbacks[ $tag ] ); 152 | } 153 | 154 | /** 155 | * remove_from_callbacks. 156 | * 157 | * @version 1.0.0 158 | * @since 1.0.0 159 | * 160 | * @param $tag 161 | * @param $function_to_add 162 | */ 163 | private function remove_from_callbacks( $tag, $function_to_add, $priority ) { 164 | ! isset( $this->callbacks[ $tag ] ) ? $this->callbacks[ $tag ] = array() : $this->callbacks[ $tag ]; 165 | $function_to_add = $this->modify_callback_if_string( $function_to_add ); 166 | $function_to_add[] = $priority; 167 | $found = array_search( $function_to_add, $this->callbacks[ $tag ] ); 168 | if ( false !== $found ) { 169 | unset( $this->callbacks[ $tag ][ $found ] ); 170 | } 171 | } 172 | 173 | /** 174 | * modify_callback_if_string. 175 | * 176 | * @version 1.0.0 177 | * @since 1.0.0 178 | * 179 | * @param $callback 180 | * 181 | * @return array|string 182 | */ 183 | private function modify_callback_if_string( $callback ) { 184 | if ( is_string( $callback ) ) { 185 | $callback = array( $callback ); 186 | } 187 | return $callback; 188 | } 189 | 190 | /** 191 | * remove_filter. 192 | * 193 | * @version 1.0.0 194 | * @since 1.0.0 195 | * 196 | * @param $tag 197 | * @param callable $function_to_remove 198 | * @param int $priority 199 | */ 200 | public function remove_filter( $tag, $function_to_remove, $priority = 10 ) { 201 | $function_to_remove = $this->modify_callback_if_string( $function_to_remove ); 202 | $function_to_remove[] = $priority; 203 | $this->callbacks[ $tag ][] = $function_to_remove; 204 | $this->callbacks[ $tag ] = array_unique( $this->callbacks[ $tag ], SORT_REGULAR ); 205 | } 206 | 207 | /** 208 | * remove_filter. 209 | * 210 | * @version 1.0.0 211 | * @since 1.0.0 212 | * 213 | * @param $tag 214 | * @param callable $function_to_remove 215 | * @param int $priority 216 | */ 217 | public function remove_action( $tag, $function_to_remove, $priority = 10 ) { 218 | $this->remove_filter( $tag, $function_to_remove, $priority ); 219 | } 220 | 221 | } 222 | } -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer\Autoload; 14 | 15 | /** 16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. 17 | * 18 | * $loader = new \Composer\Autoload\ClassLoader(); 19 | * 20 | * // register classes with namespaces 21 | * $loader->add('Symfony\Component', __DIR__.'/component'); 22 | * $loader->add('Symfony', __DIR__.'/framework'); 23 | * 24 | * // activate the autoloader 25 | * $loader->register(); 26 | * 27 | * // to enable searching the include path (eg. for PEAR packages) 28 | * $loader->setUseIncludePath(true); 29 | * 30 | * In this example, if you try to use a class in the Symfony\Component 31 | * namespace or one of its children (Symfony\Component\Console for instance), 32 | * the autoloader will first look for the class under the component/ 33 | * directory, and it will then fallback to the framework/ directory if not 34 | * found before giving up. 35 | * 36 | * This class is loosely based on the Symfony UniversalClassLoader. 37 | * 38 | * @author Fabien Potencier 39 | * @author Jordi Boggiano 40 | * @see http://www.php-fig.org/psr/psr-0/ 41 | * @see http://www.php-fig.org/psr/psr-4/ 42 | */ 43 | class ClassLoader 44 | { 45 | // PSR-4 46 | private $prefixLengthsPsr4 = array(); 47 | private $prefixDirsPsr4 = array(); 48 | private $fallbackDirsPsr4 = array(); 49 | 50 | // PSR-0 51 | private $prefixesPsr0 = array(); 52 | private $fallbackDirsPsr0 = array(); 53 | 54 | private $useIncludePath = false; 55 | private $classMap = array(); 56 | private $classMapAuthoritative = false; 57 | private $missingClasses = array(); 58 | private $apcuPrefix; 59 | 60 | public function getPrefixes() 61 | { 62 | if (!empty($this->prefixesPsr0)) { 63 | return call_user_func_array('array_merge', $this->prefixesPsr0); 64 | } 65 | 66 | return array(); 67 | } 68 | 69 | public function getPrefixesPsr4() 70 | { 71 | return $this->prefixDirsPsr4; 72 | } 73 | 74 | public function getFallbackDirs() 75 | { 76 | return $this->fallbackDirsPsr0; 77 | } 78 | 79 | public function getFallbackDirsPsr4() 80 | { 81 | return $this->fallbackDirsPsr4; 82 | } 83 | 84 | public function getClassMap() 85 | { 86 | return $this->classMap; 87 | } 88 | 89 | /** 90 | * @param array $classMap Class to filename map 91 | */ 92 | public function addClassMap(array $classMap) 93 | { 94 | if ($this->classMap) { 95 | $this->classMap = array_merge($this->classMap, $classMap); 96 | } else { 97 | $this->classMap = $classMap; 98 | } 99 | } 100 | 101 | /** 102 | * Registers a set of PSR-0 directories for a given prefix, either 103 | * appending or prepending to the ones previously set for this prefix. 104 | * 105 | * @param string $prefix The prefix 106 | * @param array|string $paths The PSR-0 root directories 107 | * @param bool $prepend Whether to prepend the directories 108 | */ 109 | public function add($prefix, $paths, $prepend = false) 110 | { 111 | if (!$prefix) { 112 | if ($prepend) { 113 | $this->fallbackDirsPsr0 = array_merge( 114 | (array) $paths, 115 | $this->fallbackDirsPsr0 116 | ); 117 | } else { 118 | $this->fallbackDirsPsr0 = array_merge( 119 | $this->fallbackDirsPsr0, 120 | (array) $paths 121 | ); 122 | } 123 | 124 | return; 125 | } 126 | 127 | $first = $prefix[0]; 128 | if (!isset($this->prefixesPsr0[$first][$prefix])) { 129 | $this->prefixesPsr0[$first][$prefix] = (array) $paths; 130 | 131 | return; 132 | } 133 | if ($prepend) { 134 | $this->prefixesPsr0[$first][$prefix] = array_merge( 135 | (array) $paths, 136 | $this->prefixesPsr0[$first][$prefix] 137 | ); 138 | } else { 139 | $this->prefixesPsr0[$first][$prefix] = array_merge( 140 | $this->prefixesPsr0[$first][$prefix], 141 | (array) $paths 142 | ); 143 | } 144 | } 145 | 146 | /** 147 | * Registers a set of PSR-4 directories for a given namespace, either 148 | * appending or prepending to the ones previously set for this namespace. 149 | * 150 | * @param string $prefix The prefix/namespace, with trailing '\\' 151 | * @param array|string $paths The PSR-4 base directories 152 | * @param bool $prepend Whether to prepend the directories 153 | * 154 | * @throws \InvalidArgumentException 155 | */ 156 | public function addPsr4($prefix, $paths, $prepend = false) 157 | { 158 | if (!$prefix) { 159 | // Register directories for the root namespace. 160 | if ($prepend) { 161 | $this->fallbackDirsPsr4 = array_merge( 162 | (array) $paths, 163 | $this->fallbackDirsPsr4 164 | ); 165 | } else { 166 | $this->fallbackDirsPsr4 = array_merge( 167 | $this->fallbackDirsPsr4, 168 | (array) $paths 169 | ); 170 | } 171 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) { 172 | // Register directories for a new namespace. 173 | $length = strlen($prefix); 174 | if ('\\' !== $prefix[$length - 1]) { 175 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 176 | } 177 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 178 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 179 | } elseif ($prepend) { 180 | // Prepend directories for an already registered namespace. 181 | $this->prefixDirsPsr4[$prefix] = array_merge( 182 | (array) $paths, 183 | $this->prefixDirsPsr4[$prefix] 184 | ); 185 | } else { 186 | // Append directories for an already registered namespace. 187 | $this->prefixDirsPsr4[$prefix] = array_merge( 188 | $this->prefixDirsPsr4[$prefix], 189 | (array) $paths 190 | ); 191 | } 192 | } 193 | 194 | /** 195 | * Registers a set of PSR-0 directories for a given prefix, 196 | * replacing any others previously set for this prefix. 197 | * 198 | * @param string $prefix The prefix 199 | * @param array|string $paths The PSR-0 base directories 200 | */ 201 | public function set($prefix, $paths) 202 | { 203 | if (!$prefix) { 204 | $this->fallbackDirsPsr0 = (array) $paths; 205 | } else { 206 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; 207 | } 208 | } 209 | 210 | /** 211 | * Registers a set of PSR-4 directories for a given namespace, 212 | * replacing any others previously set for this namespace. 213 | * 214 | * @param string $prefix The prefix/namespace, with trailing '\\' 215 | * @param array|string $paths The PSR-4 base directories 216 | * 217 | * @throws \InvalidArgumentException 218 | */ 219 | public function setPsr4($prefix, $paths) 220 | { 221 | if (!$prefix) { 222 | $this->fallbackDirsPsr4 = (array) $paths; 223 | } else { 224 | $length = strlen($prefix); 225 | if ('\\' !== $prefix[$length - 1]) { 226 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 227 | } 228 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 229 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 230 | } 231 | } 232 | 233 | /** 234 | * Turns on searching the include path for class files. 235 | * 236 | * @param bool $useIncludePath 237 | */ 238 | public function setUseIncludePath($useIncludePath) 239 | { 240 | $this->useIncludePath = $useIncludePath; 241 | } 242 | 243 | /** 244 | * Can be used to check if the autoloader uses the include path to check 245 | * for classes. 246 | * 247 | * @return bool 248 | */ 249 | public function getUseIncludePath() 250 | { 251 | return $this->useIncludePath; 252 | } 253 | 254 | /** 255 | * Turns off searching the prefix and fallback directories for classes 256 | * that have not been registered with the class map. 257 | * 258 | * @param bool $classMapAuthoritative 259 | */ 260 | public function setClassMapAuthoritative($classMapAuthoritative) 261 | { 262 | $this->classMapAuthoritative = $classMapAuthoritative; 263 | } 264 | 265 | /** 266 | * Should class lookup fail if not found in the current class map? 267 | * 268 | * @return bool 269 | */ 270 | public function isClassMapAuthoritative() 271 | { 272 | return $this->classMapAuthoritative; 273 | } 274 | 275 | /** 276 | * APCu prefix to use to cache found/not-found classes, if the extension is enabled. 277 | * 278 | * @param string|null $apcuPrefix 279 | */ 280 | public function setApcuPrefix($apcuPrefix) 281 | { 282 | $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; 283 | } 284 | 285 | /** 286 | * The APCu prefix in use, or null if APCu caching is not enabled. 287 | * 288 | * @return string|null 289 | */ 290 | public function getApcuPrefix() 291 | { 292 | return $this->apcuPrefix; 293 | } 294 | 295 | /** 296 | * Registers this instance as an autoloader. 297 | * 298 | * @param bool $prepend Whether to prepend the autoloader or not 299 | */ 300 | public function register($prepend = false) 301 | { 302 | spl_autoload_register(array($this, 'loadClass'), true, $prepend); 303 | } 304 | 305 | /** 306 | * Unregisters this instance as an autoloader. 307 | */ 308 | public function unregister() 309 | { 310 | spl_autoload_unregister(array($this, 'loadClass')); 311 | } 312 | 313 | /** 314 | * Loads the given class or interface. 315 | * 316 | * @param string $class The name of the class 317 | * @return bool|null True if loaded, null otherwise 318 | */ 319 | public function loadClass($class) 320 | { 321 | if ($file = $this->findFile($class)) { 322 | includeFile($file); 323 | 324 | return true; 325 | } 326 | } 327 | 328 | /** 329 | * Finds the path to the file where the class is defined. 330 | * 331 | * @param string $class The name of the class 332 | * 333 | * @return string|false The path if found, false otherwise 334 | */ 335 | public function findFile($class) 336 | { 337 | // class map lookup 338 | if (isset($this->classMap[$class])) { 339 | return $this->classMap[$class]; 340 | } 341 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { 342 | return false; 343 | } 344 | if (null !== $this->apcuPrefix) { 345 | $file = apcu_fetch($this->apcuPrefix.$class, $hit); 346 | if ($hit) { 347 | return $file; 348 | } 349 | } 350 | 351 | $file = $this->findFileWithExtension($class, '.php'); 352 | 353 | // Search for Hack files if we are running on HHVM 354 | if (false === $file && defined('HHVM_VERSION')) { 355 | $file = $this->findFileWithExtension($class, '.hh'); 356 | } 357 | 358 | if (null !== $this->apcuPrefix) { 359 | apcu_add($this->apcuPrefix.$class, $file); 360 | } 361 | 362 | if (false === $file) { 363 | // Remember that this class does not exist. 364 | $this->missingClasses[$class] = true; 365 | } 366 | 367 | return $file; 368 | } 369 | 370 | private function findFileWithExtension($class, $ext) 371 | { 372 | // PSR-4 lookup 373 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; 374 | 375 | $first = $class[0]; 376 | if (isset($this->prefixLengthsPsr4[$first])) { 377 | $subPath = $class; 378 | while (false !== $lastPos = strrpos($subPath, '\\')) { 379 | $subPath = substr($subPath, 0, $lastPos); 380 | $search = $subPath.'\\'; 381 | if (isset($this->prefixDirsPsr4[$search])) { 382 | $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); 383 | foreach ($this->prefixDirsPsr4[$search] as $dir) { 384 | if (file_exists($file = $dir . $pathEnd)) { 385 | return $file; 386 | } 387 | } 388 | } 389 | } 390 | } 391 | 392 | // PSR-4 fallback dirs 393 | foreach ($this->fallbackDirsPsr4 as $dir) { 394 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { 395 | return $file; 396 | } 397 | } 398 | 399 | // PSR-0 lookup 400 | if (false !== $pos = strrpos($class, '\\')) { 401 | // namespaced class name 402 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) 403 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); 404 | } else { 405 | // PEAR-like class name 406 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; 407 | } 408 | 409 | if (isset($this->prefixesPsr0[$first])) { 410 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { 411 | if (0 === strpos($class, $prefix)) { 412 | foreach ($dirs as $dir) { 413 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 414 | return $file; 415 | } 416 | } 417 | } 418 | } 419 | } 420 | 421 | // PSR-0 fallback dirs 422 | foreach ($this->fallbackDirsPsr0 as $dir) { 423 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 424 | return $file; 425 | } 426 | } 427 | 428 | // PSR-0 include paths. 429 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { 430 | return $file; 431 | } 432 | 433 | return false; 434 | } 435 | } 436 | 437 | /** 438 | * Scope isolated include. 439 | * 440 | * Prevents access to $this/self from included files. 441 | */ 442 | function includeFile($file) 443 | { 444 | include $file; 445 | } 446 | -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /vendor/composer/autoload_classmap.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', 10 | 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', 11 | 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', 12 | 'Thanks_To_IT\\WP_DICH\\DIC' => $baseDir . '/src/class-dic.php', 13 | 'Thanks_To_IT\\WP_DICH\\DIC_Interface' => $baseDir . '/src/class-dic-interface.php', 14 | 'Thanks_To_IT\\WP_DICH\\League_Container_DIC' => $baseDir . '/src/class-league-container-dic.php', 15 | 'Thanks_To_IT\\WP_DICH\\WP_DICH' => $baseDir . '/src/class-wp-dich.php', 16 | ); 17 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | array($vendorDir . '/psr/container/src'), 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/composer/autoload_real.php: -------------------------------------------------------------------------------- 1 | = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); 27 | if ($useStaticLoader) { 28 | require_once __DIR__ . '/autoload_static.php'; 29 | 30 | call_user_func(\Composer\Autoload\ComposerStaticInit24763ad7f72f50fe3e9148680f2cd91d::getInitializer($loader)); 31 | } else { 32 | $map = require __DIR__ . '/autoload_namespaces.php'; 33 | foreach ($map as $namespace => $path) { 34 | $loader->set($namespace, $path); 35 | } 36 | 37 | $map = require __DIR__ . '/autoload_psr4.php'; 38 | foreach ($map as $namespace => $path) { 39 | $loader->setPsr4($namespace, $path); 40 | } 41 | 42 | $classMap = require __DIR__ . '/autoload_classmap.php'; 43 | if ($classMap) { 44 | $loader->addClassMap($classMap); 45 | } 46 | } 47 | 48 | $loader->register(true); 49 | 50 | return $loader; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | 11 | array ( 12 | 'Psr\\Container\\' => 14, 13 | ), 14 | ); 15 | 16 | public static $prefixDirsPsr4 = array ( 17 | 'Psr\\Container\\' => 18 | array ( 19 | 0 => __DIR__ . '/..' . '/psr/container/src', 20 | ), 21 | ); 22 | 23 | public static $classMap = array ( 24 | 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', 25 | 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', 26 | 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', 27 | 'Thanks_To_IT\\WP_DICH\\DIC' => __DIR__ . '/../..' . '/src/class-dic.php', 28 | 'Thanks_To_IT\\WP_DICH\\DIC_Interface' => __DIR__ . '/../..' . '/src/class-dic-interface.php', 29 | 'Thanks_To_IT\\WP_DICH\\League_Container_DIC' => __DIR__ . '/../..' . '/src/class-league-container-dic.php', 30 | 'Thanks_To_IT\\WP_DICH\\WP_DICH' => __DIR__ . '/../..' . '/src/class-wp-dich.php', 31 | ); 32 | 33 | public static function getInitializer(ClassLoader $loader) 34 | { 35 | return \Closure::bind(function () use ($loader) { 36 | $loader->prefixLengthsPsr4 = ComposerStaticInit24763ad7f72f50fe3e9148680f2cd91d::$prefixLengthsPsr4; 37 | $loader->prefixDirsPsr4 = ComposerStaticInit24763ad7f72f50fe3e9148680f2cd91d::$prefixDirsPsr4; 38 | $loader->classMap = ComposerStaticInit24763ad7f72f50fe3e9148680f2cd91d::$classMap; 39 | 40 | }, null, ClassLoader::class); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "psr/container", 4 | "version": "1.0.0", 5 | "version_normalized": "1.0.0.0", 6 | "source": { 7 | "type": "git", 8 | "url": "https://github.com/php-fig/container.git", 9 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 10 | }, 11 | "dist": { 12 | "type": "zip", 13 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 14 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 15 | "shasum": "" 16 | }, 17 | "require": { 18 | "php": ">=5.3.0" 19 | }, 20 | "time": "2017-02-14T16:28:37+00:00", 21 | "type": "library", 22 | "extra": { 23 | "branch-alias": { 24 | "dev-master": "1.0.x-dev" 25 | } 26 | }, 27 | "installation-source": "dist", 28 | "autoload": { 29 | "psr-4": { 30 | "Psr\\Container\\": "src/" 31 | } 32 | }, 33 | "notification-url": "https://packagist.org/downloads/", 34 | "license": [ 35 | "MIT" 36 | ], 37 | "authors": [ 38 | { 39 | "name": "PHP-FIG", 40 | "homepage": "http://www.php-fig.org/" 41 | } 42 | ], 43 | "description": "Common Container Interface (PHP FIG PSR-11)", 44 | "homepage": "https://github.com/php-fig/container", 45 | "keywords": [ 46 | "PSR-11", 47 | "container", 48 | "container-interface", 49 | "container-interop", 50 | "psr" 51 | ] 52 | } 53 | ] 54 | -------------------------------------------------------------------------------- /vendor/psr/container/.gitignore: -------------------------------------------------------------------------------- 1 | composer.lock 2 | composer.phar 3 | /vendor/ 4 | -------------------------------------------------------------------------------- /vendor/psr/container/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2016 container-interop 4 | Copyright (c) 2016 PHP Framework Interoperability Group 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of 7 | this software and associated documentation files (the "Software"), to deal in 8 | the Software without restriction, including without limitation the rights to 9 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 10 | the Software, and to permit persons to whom the Software is furnished to do so, 11 | subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 18 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 19 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 20 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /vendor/psr/container/README.md: -------------------------------------------------------------------------------- 1 | # PSR Container 2 | 3 | This repository holds all interfaces/classes/traits related to [PSR-11](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md). 4 | 5 | Note that this is not a container implementation of its own. See the specification for more details. 6 | -------------------------------------------------------------------------------- /vendor/psr/container/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "psr/container", 3 | "type": "library", 4 | "description": "Common Container Interface (PHP FIG PSR-11)", 5 | "keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"], 6 | "homepage": "https://github.com/php-fig/container", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "PHP-FIG", 11 | "homepage": "http://www.php-fig.org/" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=5.3.0" 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "Psr\\Container\\": "src/" 20 | } 21 | }, 22 | "extra": { 23 | "branch-alias": { 24 | "dev-master": "1.0.x-dev" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /vendor/psr/container/src/ContainerExceptionInterface.php: -------------------------------------------------------------------------------- 1 |