Skip to content

Commit c4a49e4

Browse files
committed
Merge pull request #124 from AlexeyDsov/autoloaderExp
New Autoloader which work without include_paths and with optional namespace support
2 parents 0cced18 + 22b0730 commit c4a49e4

31 files changed

+1451
-363
lines changed

core/Form/Primitives/PrimitiveClass.class.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function of($class)
5151
Assert::isTrue(
5252
class_exists($className, true)
5353
|| interface_exists($className, true),
54-
"knows nothing about '{$className}' class"
54+
"knows nothing about '{$className}' class/interface"
5555
);
5656

5757
$this->ofClassName = $className;

doc/ChangeLog

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1+
2012-24-10 Alexey S. Denisov
2+
* global.inc.php.tpl
3+
main/Autoloader/Autoloader.class.php
4+
main/Autoloader/AutoloaderClassNotFound.class.php
5+
main/Autoloader/AutoloaderClassPathCache.class.php
6+
main/Autoloader/AutoloaderNoCache.class.php
7+
main/Autoloader/AutoloaderPool.class.php
8+
main/Autoloader/AutoloaderRecachable.class.php
9+
main/Autoloader/AutoloaderWithNamespace.class.php
10+
main/Autoloader/NamespaceDirScaner.class.php
11+
main/Autoloader/NamespaceDirScanerOnPHP.class.php
12+
main/Autoloader/NamespaceDirScanerPSR0.class.php
13+
main/Autoloader/NamespaceResolver.class.php
14+
main/Autoloader/NamespaceResolverOnPHP.class.php
15+
main/Autoloader/NamespaceResolverPSR0.class.php
16+
main/Autoloader/require.inc.php
17+
meta/bin/build.php
18+
meta/classes/MetaConfiguration.class.php
19+
misc/Autoloader.inc.php
20+
misc/BaseException.inc.php:
21+
New Autoloader which work without include_paths and use optional namespaces
22+
123
2012-09-29 Alexey S. Denisov
224

325
* core/DB/DB.class.php

global.inc.php.tpl

Lines changed: 91 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,6 @@
1616
throw new BaseException($string, $code);
1717
}
1818

19-
/* void */ function __autoload_failed($classname, $message)
20-
{
21-
eval(
22-
'if (!class_exists("ClassNotFoundException", false)) { '
23-
.'final class ClassNotFoundException extends BaseException {/*_*/} }'
24-
.'throw new ClassNotFoundException("'.$classname.': '.$message.'");'
25-
);
26-
}
27-
2819
// file extensions
2920
define('EXT_CLASS', '.class.php');
3021
define('EXT_TPL', '.tpl.html');
@@ -40,20 +31,6 @@
4031
sys_get_temp_dir().DIRECTORY_SEPARATOR.'onPHP'.DIRECTORY_SEPARATOR
4132
);
4233

43-
if (!defined('ONPHP_CLASS_CACHE'))
44-
define('ONPHP_CLASS_CACHE', ONPHP_TEMP_PATH);
45-
46-
// classes autoload magic
47-
if (!defined('ONPHP_CLASS_CACHE_TYPE'))
48-
define('ONPHP_CLASS_CACHE_TYPE', 'classPathCache');
49-
50-
require
51-
dirname(__FILE__).DIRECTORY_SEPARATOR
52-
.'misc'.DIRECTORY_SEPARATOR
53-
.'Autoloader'.EXT_MOD;
54-
55-
spl_autoload_register(array('Autoloader', ONPHP_CLASS_CACHE_TYPE), false);
56-
5734
// system settings
5835
error_reporting(E_ALL | E_STRICT);
5936
set_error_handler('error2Exception', E_ALL | E_STRICT);
@@ -89,114 +66,125 @@
8966
ONPHP_ROOT_PATH.'incubator'.DIRECTORY_SEPARATOR
9067
);
9168

92-
set_include_path(
93-
// current path
94-
get_include_path().PATH_SEPARATOR
95-
69+
if (!defined('ONPHP_CLASS_CACHE'))
70+
define('ONPHP_CLASS_CACHE', ONPHP_TEMP_PATH);
71+
72+
// classes autoload magic
73+
if (!defined('ONPHP_CLASS_CACHE_TYPE'))
74+
define('ONPHP_CLASS_CACHE_TYPE', 'AutoloaderClassPathCache');
75+
76+
require ONPHP_MAIN_PATH.'Autoloader'.DIRECTORY_SEPARATOR.'require'.EXT_MOD;
77+
78+
$autoloader = ONPHP_CLASS_CACHE_TYPE;
79+
AutoloaderPool::set('onPHP', $autoloader = new $autoloader());
80+
/* @var $autoloader AutoloaderClassPathCache */
81+
$autoloader->setNamespaceResolver(NamespaceResolverOnPHP::create())->register();
82+
83+
$autoloader->addPaths(array(
9684
// core classes
97-
.ONPHP_CORE_PATH.'Base' .PATH_SEPARATOR
98-
.ONPHP_CORE_PATH.'Cache' .PATH_SEPARATOR
85+
ONPHP_CORE_PATH.'Base' ,
86+
ONPHP_CORE_PATH.'Cache' ,
9987

100-
.ONPHP_CORE_PATH.'DB' .PATH_SEPARATOR
101-
.ONPHP_CORE_PATH.'DB'.DIRECTORY_SEPARATOR.'Transaction'.PATH_SEPARATOR
102-
.ONPHP_CORE_PATH.'DB'.DIRECTORY_SEPARATOR.'NoSQL'.PATH_SEPARATOR
88+
ONPHP_CORE_PATH.'DB' ,
89+
ONPHP_CORE_PATH.'DB'.DIRECTORY_SEPARATOR.'Transaction',
90+
ONPHP_CORE_PATH.'DB'.DIRECTORY_SEPARATOR.'NoSQL',
10391

104-
.ONPHP_CORE_PATH.'Exceptions' .PATH_SEPARATOR
92+
ONPHP_CORE_PATH.'Exceptions' ,
10593

106-
.ONPHP_CORE_PATH.'Form' .PATH_SEPARATOR
107-
.ONPHP_CORE_PATH.'Form'.DIRECTORY_SEPARATOR.'Filters'.PATH_SEPARATOR
108-
.ONPHP_CORE_PATH.'Form'.DIRECTORY_SEPARATOR.'Primitives'.PATH_SEPARATOR
94+
ONPHP_CORE_PATH.'Form' ,
95+
ONPHP_CORE_PATH.'Form'.DIRECTORY_SEPARATOR.'Filters',
96+
ONPHP_CORE_PATH.'Form'.DIRECTORY_SEPARATOR.'Primitives',
10997

110-
.ONPHP_CORE_PATH.'Logic' .PATH_SEPARATOR
111-
.ONPHP_CORE_PATH.'OSQL' .PATH_SEPARATOR
98+
ONPHP_CORE_PATH.'Logic' ,
99+
ONPHP_CORE_PATH.'OSQL' ,
112100

113101
// main framework
114-
.ONPHP_MAIN_PATH.'Base' .PATH_SEPARATOR
102+
ONPHP_MAIN_PATH.'Base' ,
115103

116-
.ONPHP_MAIN_PATH.'Criteria' .PATH_SEPARATOR
117-
.ONPHP_MAIN_PATH.'Criteria'.DIRECTORY_SEPARATOR.'Projections'.PATH_SEPARATOR
104+
ONPHP_MAIN_PATH.'Criteria' ,
105+
ONPHP_MAIN_PATH.'Criteria'.DIRECTORY_SEPARATOR.'Projections',
118106

119-
.ONPHP_MAIN_PATH.'Crypto' .PATH_SEPARATOR
107+
ONPHP_MAIN_PATH.'Crypto' ,
120108

121-
.ONPHP_MAIN_PATH.'DAOs' .PATH_SEPARATOR
122-
.ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Handlers'.PATH_SEPARATOR
123-
.ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Workers'.PATH_SEPARATOR
124-
.ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Uncachers'.PATH_SEPARATOR
109+
ONPHP_MAIN_PATH.'DAOs' ,
110+
ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Handlers',
111+
ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Workers',
112+
ONPHP_MAIN_PATH.'DAOs'.DIRECTORY_SEPARATOR.'Uncachers',
125113

126-
.ONPHP_MAIN_PATH.'Flow' .PATH_SEPARATOR
127-
.ONPHP_MAIN_PATH.'SPL' .PATH_SEPARATOR
114+
ONPHP_MAIN_PATH.'Flow' ,
115+
ONPHP_MAIN_PATH.'SPL' ,
128116

129-
.ONPHP_MAIN_PATH.'Net' .PATH_SEPARATOR
130-
.ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Http'.PATH_SEPARATOR
131-
.ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Mail'.PATH_SEPARATOR
132-
.ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Ip'.PATH_SEPARATOR
133-
.ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Soap'.PATH_SEPARATOR
117+
ONPHP_MAIN_PATH.'Net' ,
118+
ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Http',
119+
ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Mail',
120+
ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Ip',
121+
ONPHP_MAIN_PATH.'Net'.DIRECTORY_SEPARATOR.'Soap',
134122

135-
.ONPHP_MAIN_PATH.'Math' .PATH_SEPARATOR
123+
ONPHP_MAIN_PATH.'Math' ,
136124

137-
.ONPHP_MAIN_PATH.'Markup' .PATH_SEPARATOR
138-
.ONPHP_MAIN_PATH.'Markup'.DIRECTORY_SEPARATOR.'Feed'.PATH_SEPARATOR
139-
.ONPHP_MAIN_PATH.'Markup'.DIRECTORY_SEPARATOR.'Html'.PATH_SEPARATOR
125+
ONPHP_MAIN_PATH.'Markup' ,
126+
ONPHP_MAIN_PATH.'Markup'.DIRECTORY_SEPARATOR.'Feed',
127+
ONPHP_MAIN_PATH.'Markup'.DIRECTORY_SEPARATOR.'Html',
140128

141-
.ONPHP_MAIN_PATH.'OQL' .PATH_SEPARATOR
142-
.ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Expressions'.PATH_SEPARATOR
143-
.ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Parsers'.PATH_SEPARATOR
144-
.ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Statements'.PATH_SEPARATOR
129+
ONPHP_MAIN_PATH.'OQL' ,
130+
ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Expressions',
131+
ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Parsers',
132+
ONPHP_MAIN_PATH.'OQL'.DIRECTORY_SEPARATOR.'Statements',
145133

146-
.ONPHP_MAIN_PATH.'OpenId' .PATH_SEPARATOR
134+
ONPHP_MAIN_PATH.'OpenId' ,
147135

148-
.ONPHP_MAIN_PATH.'EntityProto'.PATH_SEPARATOR
149-
.ONPHP_MAIN_PATH.'EntityProto'.DIRECTORY_SEPARATOR.'Builders'.PATH_SEPARATOR
150-
.ONPHP_MAIN_PATH.'EntityProto'.DIRECTORY_SEPARATOR.'Accessors'.PATH_SEPARATOR
136+
ONPHP_MAIN_PATH.'EntityProto',
137+
ONPHP_MAIN_PATH.'EntityProto'.DIRECTORY_SEPARATOR.'Builders',
138+
ONPHP_MAIN_PATH.'EntityProto'.DIRECTORY_SEPARATOR.'Accessors',
151139

152-
.ONPHP_MAIN_PATH.'UnifiedContainer'.PATH_SEPARATOR
140+
ONPHP_MAIN_PATH.'UnifiedContainer',
153141

154-
.ONPHP_MAIN_PATH.'UI'.PATH_SEPARATOR
155-
.ONPHP_MAIN_PATH.'UI'.DIRECTORY_SEPARATOR.'View'.PATH_SEPARATOR
156-
157-
.ONPHP_MAIN_PATH.'Utils' .PATH_SEPARATOR
158-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'TuringTest'.PATH_SEPARATOR
159-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Archivers'.PATH_SEPARATOR
160-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'IO'.PATH_SEPARATOR
161-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Logging'.PATH_SEPARATOR
162-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Mobile'.PATH_SEPARATOR
163-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'CommandLine'.PATH_SEPARATOR
164-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Routers'.PATH_SEPARATOR
142+
ONPHP_MAIN_PATH.'UI',
143+
ONPHP_MAIN_PATH.'UI'.DIRECTORY_SEPARATOR.'View',
144+
145+
ONPHP_MAIN_PATH.'Utils' ,
146+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'TuringTest',
147+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Archivers',
148+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'IO',
149+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Logging',
150+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Mobile',
151+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'CommandLine',
152+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'Routers',
165153

166-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP'.PATH_SEPARATOR
167-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP'
168-
.DIRECTORY_SEPARATOR.'Pecl'.PATH_SEPARATOR
169-
.ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP'
170-
.DIRECTORY_SEPARATOR.'Exceptions'.PATH_SEPARATOR
154+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP',
155+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP'
156+
.DIRECTORY_SEPARATOR.'Pecl',
157+
ONPHP_MAIN_PATH.'Utils'.DIRECTORY_SEPARATOR.'AMQP'
158+
.DIRECTORY_SEPARATOR.'Exceptions',
171159

172-
.ONPHP_MAIN_PATH.'Messages' .PATH_SEPARATOR
173-
.ONPHP_MAIN_PATH.'Messages'.DIRECTORY_SEPARATOR.'Interface'.PATH_SEPARATOR
160+
ONPHP_MAIN_PATH.'Messages' ,
161+
ONPHP_MAIN_PATH.'Messages'.DIRECTORY_SEPARATOR.'Interface',
174162

175-
.ONPHP_MAIN_PATH.'Application' .PATH_SEPARATOR
163+
ONPHP_MAIN_PATH.'Application' ,
176164

177-
.ONPHP_MAIN_PATH.'Charts'.PATH_SEPARATOR
178-
.ONPHP_MAIN_PATH.'Charts'.DIRECTORY_SEPARATOR.'Google'.PATH_SEPARATOR
179-
.ONPHP_MAIN_PATH.'Monitoring'.PATH_SEPARATOR
165+
ONPHP_MAIN_PATH.'Charts',
166+
ONPHP_MAIN_PATH.'Charts'.DIRECTORY_SEPARATOR.'Google',
167+
ONPHP_MAIN_PATH.'Monitoring',
180168

181-
.ONPHP_META_CLASSES.PATH_SEPARATOR
169+
ONPHP_META_CLASSES,
182170

183171
/*
184-
.ONPHP_INCUBATOR_PATH
185-
.'classes'.DIRECTORY_SEPARATOR
186-
.'Application'.DIRECTORY_SEPARATOR.PATH_SEPARATOR
172+
ONPHP_INCUBATOR_PATH
173+
.'classes'.DIRECTORY_SEPARATOR
174+
.'Application'.DIRECTORY_SEPARATOR,
187175

188-
.ONPHP_INCUBATOR_PATH
189-
.'classes'.DIRECTORY_SEPARATOR
190-
.'Application'.DIRECTORY_SEPARATOR
191-
.'Markups'.DIRECTORY_SEPARATOR.PATH_SEPARATOR
192-
193-
.ONPHP_INCUBATOR_PATH
194-
.'classes'.DIRECTORY_SEPARATOR
195-
.'Application'.DIRECTORY_SEPARATOR
196-
.'Markups'.DIRECTORY_SEPARATOR
197-
.'Documents'.DIRECTORY_SEPARATOR.PATH_SEPARATOR
176+
ONPHP_INCUBATOR_PATH
177+
.'classes'.DIRECTORY_SEPARATOR
178+
.'Application'.DIRECTORY_SEPARATOR
179+
.'Markups'.DIRECTORY_SEPARATOR,
180+
181+
ONPHP_INCUBATOR_PATH
182+
.'classes'.DIRECTORY_SEPARATOR
183+
.'Application'.DIRECTORY_SEPARATOR
184+
.'Markups'.DIRECTORY_SEPARATOR
185+
.'Documents'.DIRECTORY_SEPARATOR,
198186
*/
199-
);
187+
));
200188

201189
//NOTE: disable by default
202190
//see http://pgfoundry.org/docman/view.php/1000079/117/README.txt
Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
<?php
22
/***************************************************************************
3-
* Copyright (C) 2008-2009 by Konstantin V. Arkhipov *
3+
* Copyright (C) 2012 by Aleksey S. Denisov *
44
* *
55
* This program is free software; you can redistribute it and/or modify *
66
* it under the terms of the GNU Lesser General Public License as *
77
* published by the Free Software Foundation; either version 3 of the *
88
* License, or (at your option) any later version. *
99
* *
1010
***************************************************************************/
11-
12-
class BaseException extends Exception
11+
12+
interface Autoloader
1313
{
14-
public function __toString()
15-
{
16-
return
17-
"[$this->message] in: \n".
18-
$this->getTraceAsString();
19-
}
14+
public function autoload($className);
15+
16+
public function register();
17+
18+
public function unregister();
2019
}
2120
?>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/***************************************************************************
3+
* Copyright (C) 2012 by Aleksey S. Denisov *
4+
* *
5+
* This program is free software; you can redistribute it and/or modify *
6+
* it under the terms of the GNU Lesser General Public License as *
7+
* published by the Free Software Foundation; either version 3 of the *
8+
* License, or (at your option) any later version. *
9+
* *
10+
***************************************************************************/
11+
12+
class AutoloaderClassNotFound implements Autoloader
13+
{
14+
private static $i = null;
15+
16+
protected function __construct() {
17+
/* you must'n create it outside */
18+
}
19+
20+
/**
21+
* @return AutoloaderClassNotFound
22+
*/
23+
public static function me()
24+
{
25+
return self::$i
26+
?: (self::$i = new self());
27+
}
28+
29+
public function autoload($className)
30+
{
31+
static $checkMethods = array(
32+
'class_exists',
33+
'interface_exists',
34+
'trait_exists',
35+
);
36+
37+
AutoloaderPool::autoloadWithRecache($className);
38+
if (class_exists($className, false))
39+
return;
40+
41+
foreach (debug_backtrace() as $call) {
42+
if (
43+
!empty($call['function'])
44+
&& empty($call['class'])
45+
&& in_array($call['function'], $checkMethods)
46+
)
47+
return;
48+
}
49+
50+
throw new ClassNotFoundException('"'.$className.'"');
51+
}
52+
53+
public function register()
54+
{
55+
$this->unregister();
56+
spl_autoload_register(array($this, 'autoload'));
57+
}
58+
59+
public function unregister()
60+
{
61+
spl_autoload_unregister(array($this, 'autoload'));
62+
}
63+
}
64+
?>

0 commit comments

Comments
 (0)