网站空间租赁500mb/什么是网站
使用场景
大部分情况都需要多个文件才可以业务,这就会出现类名冲突的情况发生,命名空间可以解决这类问题人。
在操作系统中目录用来将文件管理,它就扮演了命名空间的角色。例如文件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';
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要
PHP进阶架构师>>>视频、面试文档免费获取docs.qq.com
或者关注咱们下面的专栏
PHP架构师之路zhuanlan.zhihu.com
来源:https://www.cnblogs.com/pengcode/p/12585397.html