一个文件需要包含多个类,加载几个类,那么类可能出现重名的情况,PHP不允许类出现重名的情况
早期的时候,可能是给类加上前缀来控制,用这种方式来进行区分,为了让它不跟其他类有冲突
后期PHP提供了命名空间,是为了帮助解决这种问题而产生的
文件系统中会把同名的用不同的文件夹隔离起来,命名空间就是类似的
就是说你用别人的类,可能与你自己的有冲突,只要使用命名空间,比如ali命名空间,就可以跟他避免开了,所以使用第三方的时候,也不用担心,因为他们都有命名空间,命名空间就相当于文件夹
使用命名空间后,再直接使用类名就会报错
namespace App;
或者namespace App;
也可以namespace App\Controller;
class User{}
User::test();//会报错
App\User::test();
也可以在命名空间放函数
namespace Helper;
function show(){}
Helper\show();
namespace App;
include 'Common.php';
include 'Order.php';//命名空间App\Controller
App\Controller::make();//会报错,因为它依据的是App命名空间为根目录
Controller::make();//正确
Common\Comment::make();//会报错,因为它依据的是App命名空间为根目录
\Common\Comment::make();
include ‘helper.php’;//里面有一个全局函数show
function show(){
echo “app show”;
}
show();//会输出app show,因为当前文件有这个函数,就不会去包含文件里找了
常量
define不受命名空间的影响
const WEB = 'web.com';//跟函数一样,在当前找不到才会去包含文件去找
const受到命名空间的影响
命名空间关键字
在命名空间App中,可以\App\Controleler\User::make();
也可以namespace \Controller\User::make();
namespace就是指当前命名空间
$class = __NAMESPACE__.'\\Controller\User';
$class::make();
include 'Module/Shop/Controller/User.php';//这个文件的命名空间是App\Module\Shop\Controler
Module\Shop\Controller\User::make();//每次都要这么写是不是很麻烦,每次都要写这么长
可以使用
use App\Module\Shop\Controller\User;//当使用User类时,用这个命名空间,user可以写include前
User::make();
如果是
use App\Module\Shop\Controller;
User::make();//会报错,因为会去App里面找
需要
Controller\User::make();
所以一般use都要带上类名
多个类的引入
use App\Module\Shop\Service\Pay;
或者
use App\Module\Shop\Controller\User,App\Module\Shop\Service\Pay;
引入冲突
如果在service命名空间里,还有一个User类
```php
use App\Module\Shop\Controller\User as UserServer;
use App\Module\Shop\Service\User;
UserServer::make();
User::make();
echo METHOD;