仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1954|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计谈PHP 闭包特征在实践使用中的成绩

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:44:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
怎样学习,大家都知道编程是1门很枯燥的事业,所以大家一定要有兴趣,可能刚开始打算学的时候是因为别人说php有多好,php多么流行,但是后来伴随着学习的深入,你的这些PHP5.3 新版本跟从了良多新特征, 个中对照惹眼的特征之一就是撑持了闭包。那末今后,咱们也能够和那帮写 Ruby、Javascript 等等高科技言语的家伙们一样,写出十分酷的代码吗?呃,其实大局部情形下是可以的,而有些方面仍是使人十分的困扰,上面渐渐道来。   
PHP5.3 新版本跟从了良多新特征, 个中对照惹眼的特征之一就是撑持了闭包。那末今后,咱们也能够和那帮写 Ruby、Javascript 等等“高科技言语”的家伙们一样,写出十分酷的代码吗?呃,其实大局部情形下是可以的,而有些方面仍是使人十分的困扰,上面渐渐道来。
良多言语的都供应了十分优雅和大度的操作数组的办法。鄙人面的例子中,会利用 PHP5.3 和其他言语供应的闭包功效,用于展现若何“客不雅的”操作迭代数组。
译注:原文作者对照火星,我不懂得 Groovy 和 Scala 言语,所以这里我加上 Javascript 的完成。
在入手下手之前先申明下,本例子仅仅是说明概念,并没有思索功能等其他方面的要素。
“货比三家”

用个复杂的例子入手下手,有上面个数组:
  1. $nums = array(10, 20, 30, 40);
复制代码
需求找出数组中大于 15 的项。那末,不思索闭包的情形下,咱们也许会如许写:
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}
复制代码
假如言语自己有闭包撑持的,那末也许会如许写(Groovy 言语)
  1. def res = nums.findAll { it > 15 }
复制代码
或利用 Scala 言语
  1. val res = nums filter (_ > 15)
复制代码
译注:Javascript 1.6 的话会是以下
  1. var res = nums.filter(function(c){return c > 15});
复制代码
由于轮回操作已被笼统起来,所以可以看到 Groovy 、Scala (和 Javascript) 都很大度得用一行就能够弄定。
固然,假如利用 PHP5.3 的闭包,也能够做到
  1. $res = array_filter($nums, function($v) { return $v > 15; });
复制代码
PHP 在这方面利用了比 Scala 更多的字符,但对照先前的例子,它更冗长而且能更好得浏览。
特地说下,下面的 PHP 代码实践上是利用了 Lambda 解析式,并非个真实的闭包,这个 并非咱们今朝存眷的重点。具体论述 PHP 闭包和 Lambda 解析式的材料,可以参考这里。
今朝看来感到都还不错,那末咱们再的标题增添点难度:找到一切大于 15 的项, 然后乘以 2 再加上感化域中的的某个变量值今后再前往。
Groovy 的完成:
  1. def x = 1def res = nums .findAll { it > 15 } .collect { it * 2 + x }
复制代码
Scala 的完成:
  1. val x = 1val res = nums filter (_ > 15) map (_ * 2 + x)
复制代码
译注,Javascript 的完成:
  1. var i = 1;var res = nums.filter(function(c){return c > 15}).map(function(c){return c * 2 + i});
复制代码
和 PHP:
  1. $x = 1;$res = array_map( function($v) use ($x) { return $v * 2 + $x; }, array_filter( $nums, function($v) { return $v > 15; }));
复制代码
光从代码量方面,如今看起来 PHP 与其他言语有收支了。先抛开代码字面上自己 的审美不谈,下面的 PHP 代码还有个额定的成绩。
例如,假如需求利用数组的键而非值作对照,怎样办?是的,下面的代码就办不到了。同时,从语法角度上说,下面的代码十分难以浏览。
返璞归真,这时候仍是得前往老土的思绪去处理成绩:
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}0
复制代码
呼,如许看起来又很清晰了。但这个时分你也许又会利诱了:“那还瞎折腾啥,这不就是个数组操作吗?”。
是的,好戏还在后头。这个时分该让 PHP 的某些初级特征进场,来弄定这看似有自残偏向 的“无聊成绩”。
ArrayObject – 对数组的封装

PHP 有个称作 SPL 的尺度库,个中包括了个叫做 ArrayObject 的类,它能供应“像数组一 样操作类”的功效,例如
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}1
复制代码
ArrayObject 是个内置的类,所以你可以像其他类类操作一样封装它。
Arr - 包上糖衣

既然咱们已有了 ArrayObject 和闭包这些特征,咱们就能够入手下手测验考试封装它:
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}2
复制代码
好了,万事俱备。上面重写的 PHP 代码就能够处理下面提到的成绩,而且看起来语法上“差 不多”了:
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}3
复制代码
下面的代码与传统体例有何分歧呢?起首,它们可以递合并构成感化链式的挪用,因而可以 添加更多的相似操作。
同时,可以经由过程回调的两个参数分离操作数组的键和值其项 - $k 对应键和 $v 对应值 。这使得咱们可以在闭包中利用键值,这在传统的 PHP 函数 array_fliter 中是没法完成的。
别的个带来的额定优点就是加倍分歧 API 挪用。利用传统的 PHP 函数操作,它们有能够第一个参数是个闭包,或是个数组,抑或是多个数组…总之谁晓得呢?
这里是 Arr 类的完全源代码,还包括了其他有效的函数(相似 reduce 和 walk),其实它 们的完成其实体例和代码相似。
博弈

这个成绩其实很难回覆 - 这需求依据代码的高低文和法式员本身等浩瀚要素决意。其实 ,当我第一眼看见 PHP 的闭包完成时,我感到仿佛回到了那好久之前的 Java 时代,事先 我在入手下手利用匿名内置类(anonymous inner classes)来完成闭包。固然,这固然可以做到, 但看起来其实是些弄巧成拙。PHP 闭包自己是没错,只是它的完成和语法让我感应十分的猜疑。
其他具有闭包特征的言语,它们可以十分便利的挪用闭包并同时具有优雅的语法。在下面的例子 中,在 Scala 中利用传统的轮回也能够任务,但你会如许写吗?而从另个方面,那末有人 说下面这个标题利用 PHP 的闭包也能够完成,但普通情形下你会如许写吗?
可以肯定,PHP 闭包在些情形下可以成为锋利的军刀(例如延时履行和资本挪用方面), 但在传统的迭代和数组操作眼前就显得有些难堪。不要泄气不论怎样, 返璞归真编写具有兼容性的、清新的代码和 API 是最主要的。
停止语

像一切后来加上的语法特征一样(记妥当年 Java 的 Generics 特征不?和前几年的 PHP OOP 特征),它们都需求工夫磨合和终究不乱上去。跟着 PHP5.3 乃至未来的 PHP6 逐步普及,愈来愈多的技能和特征信任在不远的未来逐步的被伶俐的法式员发掘出来。
回到最后文章开首谁人标题,对照
  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}3
复制代码

  1. $res = array();foreach ($nums as $n) { if ($n > 15) { $res[] = $n; }}5
复制代码
二者之间的区分。归根结柢它们仅是语法罢了,实质上都是异曲同工处理了同个成绩。法式 言语的使用特征分歧,天然孰优孰劣也就无从对照。
最初,这里有此篇文章的代码示例, 信任可以找到更多若何利用 PHP 停止函数式迭代(固然不单单是这些)的心得。
-- Split --
不靠谱之博主心得

坦率讲,固然在 PHP5.0 之前就懂得过提出的新增闭包等功效,但在看到 PHP5.3 供应的闭 包和 Lambda 功效后,与本来心思等候的仍是有些收支。
乃至相对熟习的 JavaScript,PHP 的闭包在我看来,像是“其余言语都有了,所以我也要有” 的这类心态下的产品。
但正如上文中所言,比拟 JavaScript 等其他静态言语,PHP 出于本身的使用和完成的哲学 动身,与其他开辟言语不尽不异。
因而在某些特征的挪用体例、完成办法也会纷歧样,这不免会让熟习别的具有相似功效的言语 的人感应的不顺应。
从 PHP5.3 推出至今,还不到半年的工夫,比拟 JavaScript 等这些早已具有闭包等特征的 静态言语比拟,天然是显得十分稚嫩。
同时,宽大的开辟者关于 PHP5.3 供应的包含闭包在内的新特征还在持张望立场。PHP 的闭包特征今朝仍是存在于实行室中,其使用于实践开辟如要冲破的不单单是言语特征 ,还要经由效力、平安性等方面的考验。
但信任,如原文作者所言,跟着 PHP 版本的推动,PHP 的闭包使用场所会愈来愈频仍。像 昔时 PHP4 转换到 PHP5 一样,对言语新特征的顺应,实际上是种痛并康乐着的进程
学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。
再现理想 该用户已被删除
沙发
发表于 2015-2-4 06:29:40 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
蒙在股里 该用户已被删除
板凳
发表于 2015-2-9 17:43:22 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
变相怪杰 该用户已被删除
地板
发表于 2015-2-27 12:54:18 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
老尸 该用户已被删除
5#
发表于 2015-3-9 04:57:26 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
小女巫 该用户已被删除
6#
发表于 2015-3-16 20:40:35 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
冷月葬花魂 该用户已被删除
7#
发表于 2015-3-16 21:39:06 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
再见西城 该用户已被删除
8#
发表于 2015-3-23 03:20:38 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-24 18:48:30 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
山那边是海 该用户已被删除
10#
发表于 2015-4-12 07:26:09 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
不帅 该用户已被删除
11#
发表于 2015-4-15 02:47:13 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
谁可相欹 该用户已被删除
12#
发表于 2015-4-16 19:00:37 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
若相依 该用户已被删除
13#
发表于 2015-4-20 09:17:46 | 只看该作者
爱上php,他也会爱上你。
若天明 该用户已被删除
14#
发表于 2015-4-21 21:35:44 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
第二个灵魂 该用户已被删除
15#
发表于 2015-5-2 19:22:17 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
深爱那片海 该用户已被删除
16#
发表于 2015-5-4 06:48:13 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
分手快乐 该用户已被删除
17#
发表于 2015-5-7 18:45:53 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
飘灵儿 该用户已被删除
18#
发表于 2015-6-6 05:59:13 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
兰色精灵 该用户已被删除
19#
发表于 2015-6-9 06:04:58 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
小魔女 该用户已被删除
20#
发表于 2015-6-20 21:02:12 | 只看该作者
实践是检验自己会不会的真理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-11 04:18

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表