php 打印_PHP为什么要使用命名空间

概要:

1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。

2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。

3. PHP 5.3 及以上才能使用命名空间

名词:

关键字:namespace 用来声明 本PHP文件的命名空间

常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串

操作符: use 默认以最后一个后的字符串为别名,配合 as 则为 as后的字符串,与MySQL的字段别名一致。

为什么使用命名空间

我们的代码可能和其他开发者的代码使用相同的类名、接口名、函数或常量名,如果不使用命名空间,名称会起冲突,导致PHP执行出错。而使用命名空间将代码放到唯一的厂商命名空间,我们的代码就可以和其他开发者使用相同的类名、接口名、函数或常量名。

当然如果你开发的是小型个人项目,只有少量的依赖,类名冲突可能不是问题,但是如果在团队中工作,开发用到许多第三方依赖的大型项目,就要认真对待命名冲突问题,因为你无法控制项目依赖在全局命名空间中引入的类、接口、函数和常量,这也是为什么要使用命名空间的原因。

实际操作如下:

在apache目录下建立如下文件:index.php,Order.php,User.php

ca6321d1b4e398908f29e023cf6135bd.png

Order.php 的内容为

<?php /** * @Author: Martin * @Support: Martin * @Last Modified by: Martin */namespace Order;const STR = 'order list
';function detail(){ return 'order detail
';}function call_by_self(){ return 'call by self
';}/** * */class Orderlist{ public function __construct() { echo 'Class NameSpace is "', __NAMESPACE__, '"'; } public function show_list() { for ($i = 0; $i < 5; $i++) { echo "
  • this is order$i
    "; //内部直接访问 echo detail(); echo "
"; } }}//内部通过命名空间访问echo Ordercall_by_self();index.php 内容为:<?php /** * @Author: Martin * @Support: Martin * @Last Modified by: Martin */namespace index;include_once('Order.php');//外部访问class 实例化即可使用use OrderOrderlist;$orderlist = new orderlist;$orderlist->show_list();//外部访问静态变量和function 直接访问use Order;echo OrderSTR;echo Orderdetail();

打印结果为:

d9eac32e82678aea92939a4b9950fc40.png

以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。

命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。

下面来说一下自动加载

SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。

SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。

自动装载库有以下函数

spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类

User.php 内容为:

namespace User;//直接载入Order#include('Order.php');//自动载入spl_autoload_register(function($className) { var_dump($className);});spl_autoload_call('Order');

打印结果为:

dc913b9b71340d7b9c99fdb00cce605f.png

SPL自动载入函数包含如下:

spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。

get_include_path: 设置默认引用的文件夹

spl_autoload_register: 自动引入文件

实际操作如下:

我们重新调整目录结构和并复制order 到 lib下面 如下:

26a4aa8e72531402142672a3cd70ef96.png

修改User.php 如下:

namespace User;//直接载入Order#include('Order.php');//自动载入define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR);spl_autoload_register(function ($class) { $path = LIB_DIR . $class . '.lib.php'; include ($path);});spl_autoload_call('Order');use Order;$orderList = new OrderOrderlist();$orderList->show_list();

打印结果为:

162f1880e201cd5968e49aa7bd32c9b3.png

注意:

当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,

所有采用spl_autoload_call 来提前触发自动载入。

3b490d6709145b30a4d2aa52e0a96237.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值