php中trait(性状)与generator(生成器)
PHP中trait(性状)与generator(生成器)
PHP中trait(性状)与generator(生成器)
一、trait (性状)
最近在看Josh Lockhat的《Modern PHP》,这本书很薄。但是其中给出了一个很重要的学习方法。就是写PHP程序的时候不要凡事都自己来创造,如果已经有牛人写好了组件,直接放进自己项目中用就好了,并且给出了组件的链接。这半年看技术不少,外国的程序员比较喜欢按部就班的按照规范来写程序,包括代码规范,如何保证代码的性能方面,都严格按照工具进行测试。但是我前一份工作,对于代码规范和上线规范就比较松懈。这家公司有了很大的提高,在项目组长的要求下,还开发了功能强大的上线系统。
这本书中我看到了性状,于迭代器这两个对于我来说比较新的内容。其实这两个东西都比较好理解,因此就不单独写博客介绍了,合并在一篇博客中介绍,大家看代码就好。
<?php
header("content-type:text/html;charset=utf-8");
trait BandAid
{
public function __construct()
{
echo "Hello BandAid<br/>";
}
public function getName()
{
echo "Roverliang<br/>";
}
}
trait BandAid_2
{
public function hello()
{
echo "I'm BandAid_2<br/>";
}
}
class Body
{
use BandAid;
use BandAid_2;
public function __construct()
{
echo "Hello Body<br/>";
}
public function makeDance()
{
echo "Dance<br/>";
}
}
$roverliang = new Body();
$roverliang->getName();
$roverliang->makeDance();
$roverliang->hello();
结果:
Hello Body
Roverliang
Dance
I'm BandAid_2
其实PHP manual 中关于性状讲解的更为清晰:trait:性状
其中有一个需要注意点,容易犯错代码如下:
<?php
header("content-type:text/html;charset=utf-8");
class TestClass
{
public static $bar;
}
class Foo1 extends TestClass {}
class Foo2 extends TestClass {}
Foo1::$bar = "hello";
Foo2::$bar = "World";
echo Foo1::$bar;
echo Foo2::$bar;
//result is
/**
* WorldWorld
*/
/*********************************************/
trait TestTrait
{
public static $bar;
}
class Foo3
{
use TestTrait;
}
class Foo4
{
use TestTrait;
}
Foo3::$bar = "Hello";
Foo4::$bar = "world";
echo Foo3::$bar;
echo Foo4::$bar;
//result
/**
* Helloworld
*/
由于这个markdown 工具没有代码折叠的功能,所以只能让大家看这么冗长的代码了。trait 是一种灵活的代码段。PHP5.4 版本才增加这个功能,所以使用的时候一定要先看下自己所使用的PHP版本。PHP文档中说了,trait是一种代码复用的方法。我对于trait理解是,trait就是一个创可贴,哪里需要了就贴上去,满足功能。trait的__construct 在使用的时候会被重写,因此使用trait的时候可以不用写构造函数。
generator(生成器)
关于生成器详细可以看官方文档:生成器总览
尤其要注意的是,生成器的版本要求是PHP 5 >= 5.5.0, PHP 7
示例如下:
<?php
header("content-type:text/html;charset=utf-8");
date_default_timezone_set('Asia/Shanghai');
$file = "./ip-to-country.csv";
function getFile($file)
{
$handler = fopen($file, 'rb');
if ($handler === false) {
throw new Exception();
}
while (!feof($handler)) {
yield fgetcsv($handler);
}
fclose($handler);
}
$stime = microtime(true);
foreach (getFile($file) as $val) {
//print_r($val); save to redis
}
$etime = microtime(true);
$exectime_1 = $etime - $stime;
function getFile_2($file)
{
$handler = fopen($file, 'rb');
if ($handler === false) {
throw new Exception();
}
while (!feof($handler)) {
fgetcsv($handler); //save to redis
}
fclose($handler);
}
$stime = microtime(true);
getFile_2($file);
$etime = microtime(true);
$exectime_2 = $etime - $stime;
echo $exectime_1;
echo "\r\n";
echo $exectime_2;
echo "\r\n";
//352.71399402618
//331.73138713837
本文测试的文件大小如下:
[root@roverliang html]# ls -lh
总用量 2.0G
-rwxr--r--. 1 jack jack 171 11月 17 13:23 Creator.php
-rwxr--r--. 1 jack jack 236 11月 17 13:27 GraphicFactory.php
-rwxr--r--. 1 jack jack 963 11月 20 07:53 index.php
-rwxr--r--. 1 root root 2.0G 11月 20 06:38 ip-to-country.csv
-rwxr--r--. 1 jack jack 243 11月 19 13:38 TextFactory.php
经过测试发现,迭代器在读取大文件时候并没有表现出其官网所宣称的那种效率。甚至比使用使用常规的逐行读取方法还要慢一点点,不过这种时间上的差距可以忽视。比第二种方式略慢,可能是因为迭代器内部的状态切换所带来的性能开销。
那么两种方式在系统内存和cpu占用上有何不同,看下图:
使用迭代器
不使用
由此可以看出,使用迭代器和不使用两者并没有明显不同。
虽然如此,还是需要了解迭代器,至少给予我们一种不同的方式来进行数据操作。
php中trait(性状)与generator(生成器)的更多相关文章
- ES6新特性:Javascript中Generator(生成器)
ES6的很多特性都跟Generator扯上关系,而且实际用处比较广, 包含了任何需要异步的模块, 比如ajax, filesystem, 或者数组对象遍历等都可以用到: Generator的使用: G ...
- ES6中的迭代器(Iterator)和生成器(Generator)
前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...
- Javascript中Generator(生成器)
阅读目录 Generator的使用: yield yield* next()方法 next()方法的参数 throw方法() return()方法: Generator中的this和他的原型 实际使用 ...
- ES6中的迭代器(Iterator)和生成器(Generator)(一)
用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...
- ES6笔记(5)-- Generator生成器函数
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...
- MyBatis Generator 生成器把其他数据库的同名表生成下来的问题
[问题] 使用MyBatis Generator生成器时,发现Mapper文件中出现字段与连接数据库不符,经过查找发现该表是其他数据库的同名表的字段. [解决问题] 在构造文件中,这里是generat ...
- Generator生成器函数
接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...
- Python高级语法之:一篇文章了解yield与Generator生成器
Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多 ...
- 取代Promise的Generator生成器函数
接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...
随机推荐
- switch语句的妙用
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console. ...
- ContentProvider中央档案馆,以及获取联系人电话的示例
Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...
- MVC 5 中Filter控制 action的访问权限
1,创建一个继承自 FilterAttribute, IActionFilter的类 namespace HeatMetering2.Filters { public class HMV2Authen ...
- yii2 ActiveRecord多表关联以及多表关联搜索的实现
作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明 ...
- JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器
Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...
- javascript-组合模式
组合模式笔记 组合模式又称部分-整体模式,将对象组合成树形结构以表示'部分整体'的层次结构 组合模式使得用户对单个对象和组合对象的使用具有一致性 demo实例 :表单模块 要调用到前面学习到的寄生组合 ...
- MySQL排序原理与案例分析
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct ...
- PHP相关笔记
扩展包(相关链接):https://packagist.org/: 插件postman主要应用于web开发时get.post请求时查看其响应:
- ASP.NET MVC Controllers and Actions
MVC应用程序里的URL请求是通过控制器Controller处理的,不管是请求视图页面的GET请求,还是传递数据到服务端处理的Post请求都是通过Controller来处理的,先看一个简单的Contr ...
- HDOJ 2317. Nasty Hacks 模拟水题
Nasty Hacks Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...