b95a1d79873acc69b48aba21b20b6c32ff7ae86e
[yaffs-website] / vendor / symfony / class-loader / WinCacheClassLoader.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\ClassLoader;
13
14 /**
15  * WinCacheClassLoader implements a wrapping autoloader cached in WinCache.
16  *
17  * It expects an object implementing a findFile method to find the file. This
18  * allow using it as a wrapper around the other loaders of the component (the
19  * ClassLoader for instance) but also around any other autoloaders following
20  * this convention (the Composer one for instance).
21  *
22  *     // with a Symfony autoloader
23  *     $loader = new ClassLoader();
24  *     $loader->addPrefix('Symfony\Component', __DIR__.'/component');
25  *     $loader->addPrefix('Symfony',           __DIR__.'/framework');
26  *
27  *     // or with a Composer autoloader
28  *     use Composer\Autoload\ClassLoader;
29  *
30  *     $loader = new ClassLoader();
31  *     $loader->add('Symfony\Component', __DIR__.'/component');
32  *     $loader->add('Symfony',           __DIR__.'/framework');
33  *
34  *     $cachedLoader = new WinCacheClassLoader('my_prefix', $loader);
35  *
36  *     // activate the cached autoloader
37  *     $cachedLoader->register();
38  *
39  *     // eventually deactivate the non-cached loader if it was registered previously
40  *     // to be sure to use the cached one.
41  *     $loader->unregister();
42  *
43  * @author Fabien Potencier <fabien@symfony.com>
44  * @author Kris Wallsmith <kris@symfony.com>
45  * @author Artem Ryzhkov <artem@smart-core.org>
46  */
47 class WinCacheClassLoader
48 {
49     private $prefix;
50
51     /**
52      * A class loader object that implements the findFile() method.
53      *
54      * @var object
55      */
56     protected $decorated;
57
58     /**
59      * Constructor.
60      *
61      * @param string $prefix    The WinCache namespace prefix to use
62      * @param object $decorated A class loader object that implements the findFile() method
63      *
64      * @throws \RuntimeException
65      * @throws \InvalidArgumentException
66      */
67     public function __construct($prefix, $decorated)
68     {
69         if (!extension_loaded('wincache')) {
70             throw new \RuntimeException('Unable to use WinCacheClassLoader as WinCache is not enabled.');
71         }
72
73         if (!method_exists($decorated, 'findFile')) {
74             throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
75         }
76
77         $this->prefix = $prefix;
78         $this->decorated = $decorated;
79     }
80
81     /**
82      * Registers this instance as an autoloader.
83      *
84      * @param bool $prepend Whether to prepend the autoloader or not
85      */
86     public function register($prepend = false)
87     {
88         spl_autoload_register(array($this, 'loadClass'), true, $prepend);
89     }
90
91     /**
92      * Unregisters this instance as an autoloader.
93      */
94     public function unregister()
95     {
96         spl_autoload_unregister(array($this, 'loadClass'));
97     }
98
99     /**
100      * Loads the given class or interface.
101      *
102      * @param string $class The name of the class
103      *
104      * @return bool|null True, if loaded
105      */
106     public function loadClass($class)
107     {
108         if ($file = $this->findFile($class)) {
109             require $file;
110
111             return true;
112         }
113     }
114
115     /**
116      * Finds a file by class name while caching lookups to WinCache.
117      *
118      * @param string $class A class name to resolve to file
119      *
120      * @return string|null
121      */
122     public function findFile($class)
123     {
124         $file = wincache_ucache_get($this->prefix.$class, $success);
125
126         if (!$success) {
127             wincache_ucache_set($this->prefix.$class, $file = $this->decorated->findFile($class) ?: null, 0);
128         }
129
130         return $file;
131     }
132
133     /**
134      * Passes through all unknown calls onto the decorated object.
135      */
136     public function __call($method, $args)
137     {
138         return call_user_func_array(array($this->decorated, $method), $args);
139     }
140 }