您的位置:首页 > 编程语言 > PHP开发

21.php命名空间

2016-02-20 12:08 656 查看
命名空间是对工程和类管理的一种替代解决方式,本质上是是语言设计缺陷大规避,目的是为了工程的方便管理和防止同名类的加载。

我们不使用命名空间,并引入另外一个文件,我创建了三个文件待用,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{....}就可以创建 ,但是通常我们不会这么用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: