PHP新特性详解之命名空间、性状与生成器


Posted in PHP onJuly 18, 2017

本文主要跟大家介绍了关于PHP新特性之命名空间、性状与生成器的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

1.命名空间

命名空间是什么?

     1).命名空间在PHP 5.3中被引入,类似于文件夹的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空间下。

     2).命名空间始终应该在<?php标签的下面一行。

     3).PHP文件的命名空间和操作系统的物理文件系统不同,这是一个虚拟的概念,没有必要和文件系统的目录结构完全对应。虽然如此,绝大多数PHP组件为了兼容广泛使用的PSR4自动加载标准,会把子命名空间放到文件系统的子目录中去。

     4).命名空间只是PHP语言的一种记号,PHP解释器会将这种记号作为前缀添加到类、接口、函数和常量的名称前面。

为什么需要命名空间?

     1).命名空间使得程序可以像沙盒一样运行,可以和其他开发者编写的代码一起使用。确保了自己的代码和项目可以和项目的第三方依赖一起使用。

声明命名空间

     1).顶层命名空间经常用于设定顶层厂商名。2).厂商的命名空间必须具有全局唯一性,子命名空间就没有那么重要,但有助于组织项目的代码。

导入和别名

     1).从PHP5.3开始可以导入PHP类、接口和其他命名空间,并为其创建别名。从PHP5.6开始可以导入PHP函数和常量,并为其创建别名。

     2).使用use关键字导入代码时无须在开头加上符号,因为PHP假定导入的是完全限定命名空间。use关键字必须出现在全局作用域中即不能出现在类或者函数中,因为这个关键字是在编译的时候使用的,不过,use关键字可以在命名空间声明语句后使用,导入其他命名空间的代码。

从PHP5.6开始我们可以导入函数和常量。

<?php
use func Namespace\functionName;

functionName();

也可以导入常量,

use constant Namespace\CONS_NAME;
echo CONS_NAME;

函数和常量的别名与类名的创建方式一样。

最佳实践

      1).PHP允许在一个PHP文件中定义多个命名空间。但是这么做容易让人困惑,违背了一个文件一个类的良好实践。2).在一个命名空间中引用全局的命名空间的代码时,需要加上前缀,告诉PHP需要在全局中查找该类,例如PHP原生的异常类。

自动加载

      1).命名空间为PHP-FIG制定的PSR4自动加载器奠定了坚实的基础。

2.使用接口

      1).就像我可以选择开不一样的车。因为他们都有方向盘、油门和刹车,并且燃料都是汽油。

3.性状

      1).形状是类的部分实现(常量、属性和方法),可以混入一个或者多个现有的PHP类中,性状有两个作用,表明类可以做什么(类似接口),提供模块化实践(类似类)。

      2).性状使得两个无关的类可以使用相同属性和方法。

      3).PHP解释器会把性状复制粘贴到类的定义体中。

4.创建生成器

1)在普通函数中一次或者多次使用yield关键字,不返回值,只生成值,这个函数就是一个生成器。例如:

<?php
function myGenerator() {
 yield 'value1';
 yield 'value2';
}

调用生成器函数的时候,PHP会返回一个属于Generator类的对象,这个对象可以使用foreach()函数迭代,每次迭代,PHP会要求这个对象的实例计算并提供下一个要迭代的值,生成器的优雅之处就是在每产出一个值之后,生成器内部状态会一直停顿和恢复之间切换,直到抵达定义体的末尾或者遇到空的return;语句为止,例如:

<?php
foreach (myGenerator() as $yieldedValue) {
 echo $yieldedValue, PHP_EOL;
}

以上例子会输出

value1
value2

2).生成器是如何节约内存的?生成一个范围内的数值(错误方式)

function makeRange($length) {
 $dataset = [];
 for ($i=0; $i < $length; $i++) {
 $dataset[] = $i;
 }
 return $dataset;
}

$customRange = makeRange(1000000);
foreach ($customeRange as $i) {
 echo $i, PHP_EOL;
}

预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。

function makeRange($length) {
 for ($i = 0; $i < $length; $i++) {
 yield $i;
 }
}

foreach(makeRange(1000000) as $i) {
 echo $i, PHP_EOL;
}

在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。

function getRows($file) {
 $handle = fopen($file, 'rb');
 if ($handle === false) {
 throw new Exception();
 }
 //feof()函数检测是否到达文件末尾
 while (feof($handle) === false) {
 //fgetcsv()一次读取csv文件的一行
 yield fgetcsv($handle);
 }
 fclose($handle)
}

foreach (getRows('data.csv') as $row) {
 print_r($row);
}

3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。

原生迭代器链接

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php zend 相对路径问题
Jan 12 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
aec加密 php_php aes加密解密类(兼容php5、php7)
Mar 14 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 #PHP
PHP基于XMLWriter操作xml的方法分析
Jul 17 #PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 #PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 #PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 #PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 #PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 #PHP
You might like
数字转英文
2006/12/06 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
php 中的closure用法详解
2017/06/12 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python 硬币兑换问题
2019/07/29 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
基于python 凸包问题的解决
2020/04/16 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
数据库基础的一些面试题
2012/02/25 面试题
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
社会学专业求职信
2014/02/24 职场文书
班级课外活动总结
2014/07/09 职场文书
邀请函模板
2015/02/02 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
AJAX学习笔记
2021/05/18 Javascript