1
|
$db
=
new
DB
(
)
;
|
1
|
Fatal
error
:
Class 'DB'
not
found
in
D
:
\wamp\www\testphp\autoload\
index
.php
on
line
3
|
1
2
3
4
5
6
|
$db
=
new
DB
(
)
;
function __autoload
(
$className
)
{
echo $className;
exit
(
)
;
}
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$db
=
new
DB
(
)
;
function __autoload
(
$className
)
{
require $className . '.php';
}
DB.php
class
DB
{
public function __construct
(
)
{
echo 'Hello DB';
}
}
|
1
2
3
4
5
6
7
8
9
|
<
?php
function __autoload
(
$className
)
{
require $className . '.php';
}
$db
=
new
DB
(
)
;
$info
=
new
Info
(
)
;
$gender
=
new
Gender
(
)
;
$
name
=
new
Name
(
)
;
|
1
|
Height
:
:
test
(
)
;
|
sql_autoload_resister($param)这个参数能够有多种形式:
sql_autoload_resister('load_function'); //函数名
sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法
sql_autoload_resister('load_object::load_function'); //类和方法的静态调用
1
2
3
4
5
6
|
/
/
php
5.3
以后,也能够像这样支持匿名函数了。
spl_autoload_register
(
function
(
$className
)
{
if
(
is_file
(
'.
/
lib
/
' . $className . '.php'
)
)
{
require '.
/
lib
/
' . $className . '.php';
}
}
)
;
|
1
2
3
4
5
6
7
|
function load
1
(
$className
)
{
echo
1
;
require $className . '.php';
}
spl_autoload_register
(
'load
1
'
)
;
/
/
将load
1
函数注册到自动加载队列中。
$db
=
new
DB
(
)
;
/
/
找不到DB类,就会自动去调用刚注册的load
1
函数了
|
01
02
03
04
05
06
07
08
09
10
11
|
class
autoloading
{
/
/
必须是静态方法,否则报错
public static function load
(
$className
)
{
require $className . '.php';
}
}
/
/
2
种方法均可以
spl_autoload_register
(
array
(
'autoloading'
,
'load'
)
)
;
spl_autoload_register
(
'autoloading
:
:
load'
)
;
$db
=
new
DB
(
)
;
/
/
会自动找到
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
function load
1
(
$className
)
{
echo
1
;
if
(
is_file
(
$className . '.php'
)
)
{
require $className . '.php';
}
}
function load
2
(
$className
)
{
echo
2
;
if
(
is_file
(
'.
/
app
/
' . $className . '.php'
)
)
{
require '.
/
app
/
' . $className . '.php';
}
}
function __autoload
(
$className
)
{
echo
3
;
if
(
is_file
(
'.
/
lib
/
' . $className . '.php'
)
)
{
require '.
/
lib
/
' . $className . '.php';
}
}
/
/
注册了
3
个
spl_autoload_register
(
'load
1
'
)
;
spl_autoload_register
(
'load
2
'
)
;
spl_autoload_register
(
'__autoload'
)
;
$db
=
new
DB
(
)
;
/
/
DB就在本目录下
$info
=
new
Info
(
)
;
/
/
Info 在
/
lib
/
Info.php
|
1
2
|
1
Hello DB
123
Hello Info
|
1
2
3
4
5
6
|
var_dump
(
spl_autoload_functions
(
)
)
;
/
/
数组的形式输出
array
(
size
=
3
)
0
=
>
string
'load
1
'
(
length
=
5
)
1
=
>
string
'load
2
'
(
length
=
5
)
2
=
>
string
'__autoload'
(
length
=
10
)
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
AutoLoading\loading
<
?php
namespace AutoLoading;
class
loading
{
public static function autoload
(
$className
)
{
/
/
根据PSR
-
O的第
4
点 把 \ 转换层(目录风格符) DIRECTORY_SEPARATOR
,
/
/
便于兼容Linux文件找。Windows 下(
/
和 \)是通用的
/
/
因为namspace 很规格,因此直接很快就能找到
$fileName
=
str_replace
(
'\\'
,
DIRECTORY_SEPARATOR
,
DIR . '\\'. $className
)
. '.php';
if
(
is_file
(
$fileName
)
)
{
require $fileName;
}
else
{
echo $fileName . '
is not
exist'; die;
}
}
}
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<
?php
/
/
定义当前的目录绝对路径
define
(
'DIR'
,
dirname
(
__FILE__
)
)
;
/
/
加载这个文件
require DIR . '
/
loading.php';
/
/
采用`命名空间`的方式注册。php
5.3
加入的
/
/
也必须是得是static静态方法调用,而后就像加载namespace的方式调用,注意:不能使用use
spl_autoload_register
(
"\\AutoLoading\\loading::autoload"
)
;
/
/
调用三个namespace类
/
/
定位到Lib目录下的Name.php
Lib\Name
:
:
test
(
)
;
/
/
定位到App目录下Android目录下的Name.php
App\Android\Name
:
:
test
(
)
;
/
/
定位到App目录下Ios目录下的Name.php
App\Ios\Name
:
:
test
(
)
;
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
APP\Android\Name
namespace App\Android;
class
Name
{
public function __construct
(
)
{
echo __NAMESPACE__ .
"<br>"
;
}
public static function test
(
)
{
echo __NAMESPACE__ . ' static function test
<
br
>
';
}
}
|
1
2
3
|
Lib static function test
App\Android static function test
App\Ios static function test
|
1
2
|
new
Lib\Db\MySQL
(
)
;
/
/
报错,提示说 D
:
\wamp\www\testphp\module\Lib\Lib\Db\MySQL.php
is not
exist
|
1
2
|
new
MySQL
(
)
;
/
/
直接这样就能够了。
new
Db\MySQL
(
)
;
/
/
若是有个Db文件夹
,
就这样。
|
1
2
|
use Lib\Db\MySQL;
new
MySQL
(
)
;
|
1
2
|
use Lib\Register;
Register
:
:
getInstance
(
)
;
|