龙空技术网

PHP 命名空间

寒笛过霜天 59

前言:

此时姐妹们对“headerphputf8”可能比较着重,各位老铁们都需要剖析一些“headerphputf8”的相关资讯。那么小编同时在网摘上搜集了一些关于“headerphputf8””的相关资讯,希望我们能喜欢,大家一起来学习一下吧!

1、什么是命名空间

所谓的命名空间就是为了解决函数、常量(const定义的常量)以及类的命名冲突问题。

2、使用命名空间解决命名冲突问题

基本语法:

namespace(关键词) + 空间名称(虚拟的, 与真实路径没有任何关系, 可以任意定义)

<?php//定义命名空间namespace First;//定义一个类class Controller{}//定义命名空间namespace Second;//定义一个类class Controller{}?>

3、子命名空间

命名空间是虚拟的, 其定义方式也可以与路径相似, 采用多级结构。

<?php//定义命名空间namespace Admin\First;//定义一个类class Controller{}//定义命名空间namespace Home\Second;//定义一个类class Controller{}

4、命名空间注意事项

在实际项目开发中, 第一个命名空间前面不能出现任何其他代码! 谨记!!!

<?phpheader("Content-type:text/html; charset=utf-8");namespace Admin\First;?>Fatal error: Namespace declaration statement has to be the very first statement in the script in E:\wamp\apache\htdocs\20160624\namespace.php on line 3

5、命名空间的访问

第一种方式:非限定名称访问方式

<?phpnamespace Admin\First;class Controller{    public function __construct(){    echo 'first';    }}namespace Home\Second;class Controller{    public function __construct(){    echo 'Second';    }}$construct = new Controller(); //Second?>

遵循的原则:就近原则

第二种方式:限定名称访问方式(需要使用use引入命名空间)

<?phpnamespace Admin\First;class Controller{    public function __construct(){        echo 'first';    }}namespace Home\Second;class Controller{    public function __construct(){        echo 'Second';    }}// 使用use引入命名空间use Admin\First;$construct = new Controller(); //Second 引入空间不会改变访问空间,还是访问当前空间echo "<hr>";$construct = new First\Controller(); //First?>

特别说明:默认情况下, 使用use方法引入命名空间并不会改变空间路径, 访问的还是就近的命名空间。如何解决以上问题呢?

答:使用限定名称访问方式

$对象 = new 命名空间\类名称的形式

use 也可以引入命名空间+类名

<?phpnamespace Admin\First;class Controller{    public function __construct(){    echo 'first';    }}namespace Home\Second;class Controller{    public function __construct(){    echo 'Second';    }}// 使用use引入命名空间use Admin\First\Controller;$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间?>

第三种方式:完全限定名称访问命名空间

<?phpnamespace Admin\First;class Controller{    public function __construct(){        echo 'first';    }}namespace Home\Second;class Controller{    public function __construct(){        echo 'Second';    }}$construct = new \Admin\First\Controller(); //First?>

注意:完全限定访问方式必须以"\"方式访问;

6、使用use导入空间类(ThinkPHP框架导入方式)

基本语法:

use 命名空间\类名称;

<?phpnamespace Admin\Controller;use Think\Controller;?>

特殊情况说明:如果导入的类名称与当前命名空间下的类名称一致, 就会出现名称冲突问题, 这可以使用别名的方式解决:

示例代码:

<?phpnamespace Admin\First;class Controller{    public function __construct(){    echo 'first';    }}namespace Home\Second;class Controller{    public function __construct(){    echo 'Second';    }}// 使用use引入命名空间use Admin\First\Controller as FirstController;$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间$construct = new FirstController(); //First?>

7、公共命名空间

当我们在一个命名空间下引入一个没有定义命名空间的函数、常量以及类, 我们把这种情况就称之为公用命名空间。

公共命名空间下的元素访问必须使用完全限定方式。

$std = new \stdClass();

8、const和define的区别:

前者针对命名空间发生影响, 后者不发生影响。

const可以声明多个同名称的常量

define对同名称常量只能声明一个

控制器:

//1、定义命名空间namespace Admin\Controller;//2、引入核心控制器use Think\Controller;//3引入核心模型, 必须使用此种方法use Think\Model;//4 引入自定义模型use DeptModel;//4、定义自定义控制器class PublicController extends Controller {    //5 定义login方法    public function login() {        //通过display方法显示输出模板内容        $this->display();    }}

Admin: 模块

Controller: 控制器

Admin\Controller: 代表Admin模块下的控制器

Think\Controller: 代表Think核心的控制器

模型:

<?php//1、定义命名空间namespace Admin\Model;//2、引入核心模型use Think\Model;//3、定义Dept模型class DeptModel extends Model {}

Admin: 模块

Model: 模型

Admin\Model: 代表Admin模块下的模型

Think\Model: 代表Think核心的模型

命名空间下加载文件和实例化类方法

require_once("./plugins/payment/wxpay/Api.php"); //避免重复加载$input= new \WxPayUnifiedOrder();

注意: 在命令空间外使用define()定义的常量是无法使用的, 应当使用const定义常量;

class_exists()和method_exists()使用

bool class_exists ( string $class_name [, bool $autoload = true ] )

检查指定的类是否已定义。

class_name 类名。名字的匹配是不分区大小写的。

autoload 是否默认调用 __autoload。

bool method_exists ( mixed $object , string $method_name )

检查类的方法是否存在于指定的 object中。

object 对象示例或者类名。

method_name 方法名。

<?phpnamespace Admin\First;class Controller{    public function __construct(){    		echo 'first';    }    public function say(){    		echo "这是一个说话的方法";    }}namespace Home\Second;class Controller{    public function __construct(){        echo 'Second';    }    public function say(){        echo "这是一个说话的方法";    }}if(class_exists("Admin\First\Controller")){echo "Controller类存在<br/>";$obj = new \Admin\First\Controller();if(method_exists($obj, "say")){    echo "say方法存在";}}else{    echo "Controller不存在";}echo "<br/>";echo Controller::class; //Home\Second\Controller 返回 完成 的class类名 PHP5.5新增?>

PHP 类名::class含义

自 PHP 5.5 起, 关键词 class 也可用于类名的解析。

使用 ClassName::class 可以获取一个字符串, 包含了类 ClassName 的完全限定名称。这对使用了命名空间的类尤其有用。

<?phpnamespace ddd\vector;class Demo{    public function test()    {    // code...    }}echo Demo::class; //ddd\vector\Demo?>

标签: #headerphputf8