PHP命名空間是PHP5.3開始支持。本篇講解PHP命名空間用法和PHP命名空間詳解。它的誕生使的我們在一個文件中可以使用多個同名的類而不沖突。
好處:我們的項目有一個記錄日志文件的類,叫做Log。然後我們又必須要引入另一個代碼包,這個代碼包裡也有一個叫做Log的類。那麼在一個文件中,我們記錄日志的又需要給兩個類都寫一條日志。可以類同名了,怎麼辦?這個時候,命名空間應運而生。在Java等語言中命名空間是很早就已經提供了支持,而我大PHP一直到5.3才對命名空間提供了支持。
示例一:
文件index.php
<?php
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new test\index();
$obj1->a();
?>
文件test.php
<?php
namespace test;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
?>
我們給index.php不設置命名空間,對test.php設置命名空間,名為test。運行index.php。
結果:
index.php
index : index::a
test.php
test\index : test\index::a
我們看到了,同名的類也可以運行而不沖突了。
示例二:
文件index.php
<?php
namespace index;
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new \test\index();
$obj1->a();
?>
文件test.php
<?php
namespace test;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
?>
我們給index.php設置命名空間,名為index,對test.php設置命名空間,名為test。運行index.php。
結果:
index.php
index\index : index\index::a
test.php
test\index : test\index::a
比較示例一和二,不對index.php設置命名空間,即該文件是整個PHP全局命名空間下面的一個文件,那麼使用test\index()即可,如果對index.php設置命名空間,即在其他的命名空間中使用命名空間,就要多一個“\”,就要使用\test\index()。
示例三:
文件index.php
<?php
namespace index;
include 'namespace.php';
use \test\test1\test2 as test2;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new \test\test1\test2\index();
$obj1->a();
echo '<br>';
$obj1 = new test2\index();
$obj1->a();
文件test.php
<?php
namespace test\test1\test2;
class index{
public function a(){
echo basename(__FILE__);
echo '<br>';
echo __CLASS__ . ' : ' . __METHOD__;
}
}
結果:
index.php
index\index : index\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a
這說明了什麼?別名!用過SQL吧。
select COUNT(*) as `count` from `tebleName`
嗯,一個意思。\test\test1\test2這個名字太長了,就別名為test2就好了。使用了use之後呢,這個命名空間就想到於是在index這個命名空間下面了,而不是全局命名空間的一員了,所以使用test2\index(),而不是\test2\index()。
別名時在PHP代碼編譯的時候執行的,而變量的解析則要更晚。也就是說不能對變量運用use關鍵字。示例如下(摘自官方手冊示例):
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a; // 實際化一個 Another 對象