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
(
)
;
|