命名空间是对工程和类管理的一种替代解决方式,本质上是是语言设计缺陷大规避,目的是为了工程的方便管理和防止同名类的加载。
我们不使用命名空间,并引入另外一个文件,我创建了三个文件待用,main.php,lib1.php,lib2.php
<?php
/*
* filename ./main.php
*
* */
/* namespace main; */
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
Outputer::output();
<?php
/*
* filename lib1.php
*
* */
//namespace lib1;
class Outputer{
static function output() {
echo __FILE__;
}
}
会出这样的警告,错误原因就是在全局空间中有两个完全一样的类。
我们放开上面namesapce的注释就不会再有问题。
对于命名空间的使用我们往往是根据文件的某一路径写成\PATH\TO\FILENAME。
下面说一下命名空间类之间的调用问题
直接使用本域中的类
<?php
/*
* filename ./main.php
*
* */
namespace main;
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
Outputer::output(); 使用被引用命名空间中的类
<?php
/*
* filename ./main.php
*
* */
namespace main;
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
\lib1\Outputer::output();
明确告诉解释器,我要使用的域,这在搜索域特别长的时候很有效。
<?php
/*
* filename ./main.php
*
* */
namespace main;
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
use lib1\Outputer;
Outputer::output();
这时候会出错,回到老问题上去了。
我们要使用别名来解决:
<?php
/*
* filename ./main.php
*
* */
namespace main;
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
use lib1\Outputer as lOutputer;
lOutputer::output();
在lib2.php文件中并没有使用命名空间。现在我们要访问。
<?php
/*
* filename lib2.php
*
* */
class Outputer{
static function output() {
echo __FILE__;
}
}
在访问之前加一个反斜杠就可以了
<?php
/*
* filename ./main.php
*
* */
namespace main;
require_once './lib1.php';
class Outputer{
static function output() {
echo __FILE__;
}
}
use lib1\Outputer as lOutputer;
lOutputer::output();
require_once 'lib2.php';
\Outputer::output();
当然一个文件中可以使用多个命名空间,使用namespace SPACENAME{....}就可以创建 ,但是通常我们不会这么用。