美文网首页
PHP七天系列之命名空间

PHP七天系列之命名空间

作者: PFinal南丞 | 来源:发表于2020-04-23 21:00 被阅读0次

使用场景


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

在操作系统中目录用来将文件管理,它就扮演了命名空间的角色。例如文件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 PFinalClub;

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

子命名空间


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

namespace App\Controller;

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 App\Controller;

class Order
{
    public static function make()
{
        return __METHOD__;
    }
}
Test.php
namespace App;

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

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

完全限定名称

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

echo \App\Controller\Order::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 namespace\Order::make();

别名引入


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

基本使用

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

App
--Controller
  -- Comment.php
  -- User.php
boot.php
boot.php
namespace Houdunren;

use App\Controller\User;
include 'App/Controller/User.php';
echo User::make();

如果使用 use App\Controller,在引入 User 类时方法如下

Controller\User::make()

别名

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

namespace pfinal;

use App\Controller\User as Member;

include 'App/Controller/User.php';

echo Member::make();

多个引入

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

namespace pfinal;

use App\Controller\User as Member;
use App\Controller\Comment;

include 'App/Controller/User.php';
include 'App/Controller/Comment.php';

echo Member::make();

使用逗号分隔

<?php
...
use App\Controller\User as Member, App\Controller\Comment;
...

自动加载


注册加载

以往的 __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 是PFinal社区建议使用的方式,下面简略介绍使用方法。

项目初始
$ composer init

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

修改配置文件

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

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

安装与更新

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

配置

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

include 'vendor/autoload.php';

相关文章

  • PHP七天系列之命名空间

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

  • PHP命名空间和公共空间

    PHP命名空间 PHP 命名空间(namespace)是在PHP 5.3中加入的。PHP 命名空间可以解决以下两类...

  • php命名空间与自动加载

    命名空间(PHP 5 >= 5.3.0, PHP 7) 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法...

  • PHP 新手入门指南 - 使用命名空间

    首先来了解一下命名空间: (PHP 5 >= 5.3.0, PHP 7) 什么是命名空间?从广义上来说,命名空间是...

  • php初级讲义11-命名空间

    命名空间的概念 命名空间是一种封装事物的方法。 命名空间用namespace关键字来声明。 以PHP或php为名或...

  • php命名空间

    [PHP命名空间的作用、为什么使用命名空间?] 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或...

  • PHP命名空间

    一、命名空间概述 1、什么是命名空间 1)从广义上来说,命名空间是一种封装事物的方法。2)在很多地方都可以见到这种...

  • PHP——命名空间

    PHP命名空间的作用、为什么使用命名空间 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出...

  • php 命名空间

    命名空间 什么是命名空间? 广义来说,是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目...

  • PHP命名空间

    什么是命名空间 命名空间是在php5.3以后的版本引入的。命名空间是一个抽象概念,在编程中用于封装划分一组方法or...

网友评论

      本文标题:PHP七天系列之命名空间

      本文链接:https://www.haomeiwen.com/subject/yhhyvhtx.html