• PHP-命名空间


    使用场景

    大部分情况都需要多个文件才可以业务,这就会出现类名冲突的情况发生,命名空间可以解决这类问题人。

    在操作系统中目录用来将文件管理,它就扮演了命名空间的角色。例如文件foo.txt 可以同时在目录/home/greg/home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到/home/greg/foo.txt。这 个原理应用到程序设计领域就是命名空间的概念。

    基本使用

    默认情况下常量、类和函数名都放在全局空间下。命名空间通过namespace 来声明。

    namespace 必须定义在文件头部,并在declare(strict_types=1) 语句下面。

    helper.php

    function sum()
    {
        return 'helper sum';
    }
    

    test.php

    namespace Houdunren;
    
    include 'helper.php';
    function sum()
    {
        return 'houdunren sum';
    }
    # 使用当前命名空间中的sum
    echo sum();
    # 使用 helper.php 中的sum
    echo sum();
    
    • 不指定命名空间时将使用当前命名空间
    • 如果命名空间中的函数或常量未定义,将会使用全局命名空间

    子命名空间

    PHP 命名空间也允许指定层次化的命名空间的名称,如 AppController 形式,一般情况下我们将层次与目录结构匹配。

    namespace AppController;
    
    class Bootstrap
    {
        public function make()
        {
            return __METHOD__;
        }
    }
    

    引入方式

    非限定名称

    调用类时没有指定命名空间时,将使用当前命名空间。

    下面在使用User 时没有指定命名空间将使用当前命名空间。

    namespace App;
    
    class User
    {
        public function make()
        {
            return __METHOD__;
        }
    }
    
    $user = new User;
    echo $user->make();
    

    限定名称

    限定名称类似于文件系统中的相对路径 。

    Order.php

    namespace AppController;
    
    class Order
    {
        public static function make()
        {
            return __METHOD__;
        }
    }
    

    Test.php

    namespace App;
    
    include 'Order.php';
    class User
    {
        public static function make()
        {
            return __METHOD__;
        }
    }
    echo ControllerOrder::make();
    

    使用限定名称调用 Order 类,系统会使用当前命名空间加上 Controller 做为Order 类的命名空间。

    完全限定名称

    类似于文件系统中的绝对路径,以下面的代码为例,调用Order类时可以使用以下的完全限定方式。

    echo AppControllerOrder::make();
    

    常量

    常量NAMESPACE的值是包含当前命名空间名称的字符串。

    <?php
    namespace App;
    
    function factory($class)
    {
        return __NAMESPACE__ . '\' . $class;
    }
    class User
    {
        public static function make()
        {
            return __METHOD__;
        }
    }
    class Order
    {
        public static function make()
        {
            return __METHOD__;
        }
    }
    echo factory('Order')::make();
    

    使用 namespace 关键字

    <?php
    namespace App;
    class Order
    {
        public static function make()
        {
            return __METHOD__;
        }
    }
    echo namespaceOrder::make();
    

    别名引入

    通过操作符 use 来为类或命名空间使用别名。

    基本使用

    本实例使用的示例目录结构如下:

    App
    --Controller
    	-- Comment.php
    	-- User.php
    boot.php
    

    boot.php

    namespace Houdunren;
    
    use AppControllerUser;
    include 'App/Controller/User.php';
    echo User::make();
    

    如果使用 use AppController,在引入 User 类时方法如下

    ControllerUser::make()
    

    别名

    在引入多个同名类时会有冲突情况发生,可以通过起别名的方式处理。

    namespace Houdunren;
    
    use AppControllerUser as Member;
    
    include 'App/Controller/User.php';
    
    echo Member::make();
    

    多个引入

    可以使用多行 use 或用逗号分隔多个类(空间)形式处理多个导入的情况。

    namespace Houdunren;
    
    use AppControllerUser as Member;
    use AppControllerComment;
    
    include 'App/Controller/User.php';
    include 'App/Controller/Comment.php';
    
    echo Member::make();
    

    使用逗号分隔

    <?php
    ...
    use AppControllerUser as Member, AppControllerComment;
    ...
    

    自动加载

    注册加载

    以往的__autoload 自动加载函数已经在 php7.2 废弃使用,所以使用 spl_autoload_register 函数完成自动加载处理。

    spl_autoload_register(function (string $class) {
        $file = str_replace('\', '/', $class) . '.php';
        if (!is_file($file)) {
            throw new Exception("file don't exists");
        }
        require $file;
    });
    

    使用类方法实现

    class Bootstrap
    {
        public function autoload($class)
        {
            $file = str_replace('\', '/', $class) . '.php';
            if (!is_file($file)) {
                throw new Exception("file don't exists");
            }
            require $file;
        }
    }
    spl_autoload_register([new Bootstrap, 'autoload']);
    

    composer

    使用composer 是后盾人 建议使用的方式,composer相关视频已经在 houdunren.com上更新,下面简略介绍使用方法。

    项目初始

    $ composer init
    

    直行上面命令并一直回车下去

    修改配置文件

    个性 composer.json 配置文件,其中 autoload配置项是自动加载设置。

    • files 是自动加载文件列表,适合于加载函数
    • psr-4 自动加载命名空间与目录对应关系
    {
        "name": "hd/php",
        "authors": [
            {
                "name": "houdunren.com",
                "email": "2300071698@qq.com"
            }
        ],
        "autoload": {
            "files": [
                "App/helper.php"
            ],
            "psr-4": {
                "App\": "App"
            }
        },
        "require": {}
    }
    

    安装与更新

    修改配置文件后执行 composer install 生成vendor,如果修改过配置文件需要执行 composer update

    配置

    在项目中使用以下代码即可完成自动加载。

    include 'vendor/autoload.php';
    
  • 相关阅读:
    sshkey批量分发,管理方案
    sersync 配合rsync实时同步备份
    全网实时热备inotify+rsync
    rsync定时同步配置
    全网NFS存储架构详解与分析
    linux新装系统初始化
    Cannot create a secure XMLInputFactory --CXF调用出错
    POJ 2187 /// 凸包入门 旋转卡壳
    POJ 1127 /// 判断线段与线段是否相交
    POJ 2398 map /// 判断点与直线的位置关系
  • 原文地址:https://www.cnblogs.com/pengcode/p/12585397.html
Copyright © 2020-2023  润新知