Repository navigation
Expand file tree
/
Copy pathAutoload.php
More file actions
100 lines (92 loc) · 2.63 KB
/
Copy pathAutoload.php
File metadata and controls
100 lines (92 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
namespace Codeception\Util;
/**
* Custom autoloader to load classes by suffixes: `Helper`, `Page`, `Step`, etc.
*
*/
class Autoload
{
protected static $registered = false;
protected static $map = array();
/**
* A very basic yet useful autoloader, not compatible with PSR-0.
* It is used to autoload classes by namespaces with suffixes.
*
* Example:
*
* ``` php
* <?php
* // loads UserHelper in 'helpers/UserHelper.php'
* Autoload::register('app\Codeception\Helper','Helper', __DIR__.'/helpers/');
* // loads UserHelper in 'helpers/UserHelper.php'
* Autoload::register('app\tests','Page', __DIR__.'/pageobjects/');
* Autoload::register('app\tests','Controller', __DIR__.'/controllers/');
* ?>
* ```
*
* @param $namespace
* @param $suffix
* @param $path
*/
public static function register($namespace, $suffix, $path)
{
self::$map[] = array(self::regex($namespace, $suffix), $path);
if (!self::$registered) {
spl_autoload_register(array(__CLASS__, 'load'));
self::$registered = true;
}
}
/**
* Shortcut for {@link self::register} for classes with empty namespaces.
*
* @param $suffix
* @param $path
*/
public static function registerSuffix($suffix, $path)
{
self::register('', $suffix, $path);
}
/**
* @param $class
* @return bool
*/
public static function load($class)
{
$map = array_reverse(self::$map);
foreach ($map as $record) {
list($regex, $path) = $record;
if (!preg_match($regex, $class)) {
continue;
}
$className = str_replace('\\', '', substr($class, (int)strrpos($class, '\\')));
$file = $path . DIRECTORY_SEPARATOR . $className . '.php';
if (!file_exists($file)) {
continue;
}
include_once $file;
return true;
}
return false;
}
/**
* *is public for testing purposes*
*
* @param $class
* @param $namespace
* @param $suffix
* @return bool
*/
public static function matches($class, $namespace, $suffix)
{
return (bool)preg_match(self::regex($namespace, $suffix), $class);
}
protected static function regex($namespace, $suffix)
{
$namespace = str_replace("\\", '\\\\', $namespace);
if ($namespace) {
return sprintf('~\\\\?%s\\\\\w*?%s$~', $namespace, $suffix);
} else {
return sprintf('~\w*?%s$~', $suffix);
}
}
}