even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、介绍

当项目越来越大,php的文件越来越多,定义的类型、函数、或者常量就不可避免的出现冲突的情况,特别是在多人协同开发的情况下,这个情况就更不可避免了,这个时候就需要引入php文件的命名空间来解决这个问题

2、解决方案

使用namespace关键字来解决,一旦使用了namespace这个关键字声明了,那么之后的所有代码都属于该空间

3、定义命名空间

 a、子命名空间:

<?php
namespace php\php_check;
class Check {
    public function __construct() {
        echo 'this is test';
    }
}
?>

 b、全局空间:在namespace之内是局部空间,而namespace之外的是全局空间;

 4、命名空间的使用

注意:类只在当前空间查找并使用,但是函数,常量先在当前空间找,如果当前空间没有,再去全局空间查找。

<?php
namespace php\check;
class Check {
    private $name;
    public function __construct() {
        $this->name = 'this is check';
    }
    public function get() {
        echo $this->name;
    }
}
?>
<?php
class Test {
    private $name;
    public function __construct() {
        $this->name = 'this is test';
    }
    public function get() {
        echo $this->name;
    }
}
?>

调用

<?php
namespace php\call;
require_once ('./check.php');
require_once('./test.php');
class Check {
    private $name;
    public function __construct() {
        $this->name = 'this is call check';
    }
    public function get() {
        echo $this->name;
    }
}

class Test {
    private $name;
    public function __construct() {
        $this->name = 'this is call test';
    }
    public function get() {
        echo $this->name;
    }
}

(new \php\check\Check())->get();
//输出 this is check
(new Check())->get();
//输出 this is call check
//注意use的使用
use \php\check As T;   //通常情况是以空间的最后一个名字为别名
(new T\Check())->get();
//输出 this is check

//如果需要访问全局的函数,那么加个\即可
(new \Test())->get();
//输出 this is test
(new Test())->get();
//输出 this is call test
?>

 注意:1、如果引入全部内容以及里面的类,则使用 use 空间名;2、如果想单纯引入常量:use 空间名\常量名; 3、如果想单纯引入函数:use\空间名\函数名

<?php
namespace php\check;
class Check {
    private $name;
    public function __construct() {
        $this->name = 'this is check';
    }
    public function get() {
        echo $this->name;
    }
}

CONST NAME = 'OK';

function Demo() {
    echo 'this is demo test';
}
?>

调用

<?php
namespace php\call;
require_once('./check.php');
//如果引入全部的类及内容
use \php\check As check;
(new check\Check())->get();
check\Demo();
var_dump(check\NAME);

//单纯引入常量
use CONST \php\check\NAME;
var_dump(NAME);

//单纯的引入函数
use function \php\check\Demo;
Demo();
?>

 5、命名空间的动态语言特性

介绍:我们可以把命名空间保存到变量中,这就体现了命名空间的动态语言特性

细节:在保存到变量或常量中,可以把前导的\线去除,因为两都在存变量的时候就没有区别了

check沿用上面的check文件

<?php
namespace php\call;
require_once('./check.php');
$check = 'php\check\Check';
(new $check())->get();
//输出 this is check
$check1 = '\php\check\Check';
(new $check1())->get();
//输出 this is check

$demo = '\php\check\Demo';
$demo();
//输出 this is demo test

echo __NAMESPACE__;
//输出 php\call
?>

 

posted on 2019-08-23 23:55  even_blogs  阅读(208)  评论(0编辑  收藏  举报