很多站长朋友们都不太清楚php闭包速度,今天小编就来给大家整理php闭包速度,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 js闭包和PHP闭包的区别 2、 PHP中的闭包有什么用处 3、 如何实际使用PHP5.3闭包语法特性 4、 php闭包函数 5、 php是什么? js闭包和PHP闭包的区别1 什么是闭包
php:你跟我聊闭包之前啊,首先来聊聊 匿名函数(Anonymous function)下面就是一个匿名函数的栗子,匿名函数 顾名思义就是没有名字啊。。
(PHP在引入闭包之前,也有一个可以创建匿名函数的函数:create function,但是代码逻辑只能写成字符串,这样看起来很晦涩并且不好维护,所以很少有人用。)本人没有验证~~
$func = function(){
}; //带结束符(一定要带)
实现闭包
将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。
(闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。所以下面的一段函数会报错 undefined variable a )
function add($a)
{ $a = $a; $fun1 = function ($b=2)
{ echo $a+$b; };
return $fun1; }
$fun1 = add(21);
$fun1(6);
如果想使用 $a 怎么办。php 是见招拆招啊。 关键字 use:
function add($a)
{ $a = $a; $fun1 = function ($b=2) use ($a) //只需要一个use($a)
{ echo $a+$b; };
return $fun1; }
$fun1 = add(21);
$fun1(6); //27
那么能否在匿名函数中改变上下文的 变量呢 来做个试验吧
function add($a) { // $a = $a; $fun1 = function ($b=2) use ($a) { echo $a; $a++; }; $fun1(); echo $a; }
$fun1 = add(21);
//2121 哦 很遗憾 传值是不行的
那来试试 传引用吧
function add($a) { // $a = $a; $fun1 = function ($b=2) use ($a) { echo $a; $a++; }; $fun1(); echo $a; }
$fun1(6); //2122 哦 可以的
使用use 关键字匿名函数就可以引用上下文的变量了。如果将匿名函数返回给外界,匿名函数会保存use所引用的变量,而外界则不能得到这些变量,这样形成‘闭包’这个概念可能会更清晰一些。(也就是说 use 所引用的变量 会一直保存在内存中,直到显示销毁 这是闭包的一大特点)
javascript:你们php弱爆了。我们js可以直接调用 函数外部的变量。来唠唠js的闭包吧。
先来聊聊 js的变量作用域吧。1 全局变量,2局部变量(var vname)
阮一峰前辈说:js的闭包可以简单的理解为,能够获取函数外部的变量的函数,就叫闭包。
一是读取函数内部的变量,
二是让这些变量的值保存在内存中,实现数据共享
闭包就是能够读取其他函数内部变量的函数。
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
注意:::在javascript里,在函数里声明的函数都是局部的,函数运行完后就释放了
ECMAScript 描述:
函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
PHP中的闭包有什么用处闭包其实就是外部函数定义的内部函数。
闭包的作用及好处:闭包给访问外部函数定义的内部变量创造了条件。也将关于函数的一切封闭到了函数内部,减少了全局变量,这也是闭包的真实含义。
如何实际使用PHP5.3闭包语法特性PHP 5.3闭包语法就是一个匿名函数,可以为开发者带来很多不同的体验。与JavaScript的闭包相比稍微有点不同,可以这样使用PHP 5.3闭包语法
$closure = function($param) { echo $param; };
//This one takes value of someVar and "stores" it in the closure's scope even if
//we later change the value of someVar outside it. We assume that $somerVar is defined before this
$closure2 = function($param) use ($someVar) { echo $param . ' ' . $someVar; };
比如PHP 5.3闭包语法在输出HTML中闭包很有用:
function item_list(array $items, $formatter = null) {
//create the default formatter
if($formatter == null) {
$formatter = function($row) {
return '<p>' . $row . '</p>';
};
}
$html = '<strong>Listing:</strong>';
foreach($items as $item) {
$html .= $formatter($item);
}
return $html;
}
以上就是介绍的两种不同的PHP 5.3闭包语法的使用
php闭包函数因为行数中的变量为非全局变量,外部访问不了。函数内部声明全局变量请用global关键字。
//示例
<?php
function test($str){
global $a=str;
$b=str;
}
test('ffffff');
if(isset($a)){
var_dump($a);//能够被打印,因为他是一个全局变量
}
if(isset($b)){
var_dump($b);//不会被打印出来,因为$b是函数内部的变量,不能被外部访问
}
?>
php是什么?PHP(PHP:Hypertext Prerocessor)是一种在电脑上执行的脚本语言,主要是用途在于处理动态网页,也包含了命令行执行接口(command line interface),或者产生图形使用者接口(GUI)程序。[1]
PHP 最早由 Rasmus Lerdorf 在1995年发明,现在PHP实质上的标准由PHP Group和开放源代码社群维护。PHP 以 PHP License 作为许可协议,不过因为这个协议限制了PHP名称的使用,所以和开放源代码许可协议GPL不相容。[2]
PHP 目前被广泛的应用,特别是在服务器端的网页程序开发。一般来说 PHP 大多执行在网页服务器上,透过执行PHP程序码来产生使用者浏览的网页。PHP 几乎可以在任何的操作系统上执行,而且使用 PHP 完全是免费的。根据2007年4月的统计资料,PHP 已经被安装在超过2000万个网站和100万台服务器上[3]。
目录 [隐藏]
1 开发历史
1.1 版本历程
2 应用
3 语法
3.1 类型
3.2 变量
3.3 面向对象
4 PHP相关资源
4.1 函数库
4.2 源代码编码和加速
4.3 样板引擎
5 未来发展
5.1 PHP 5.3
6 参考资料
7 外部链接
[编辑] 开发历史
PHP 的发明人 Rasmus Lerdorf
Zend Technologies的创办人之一 - Andi GutmansFile:Zeev Suraski.jpg
Zend Technologies的创办人之一 - Zeev SuraskiPHP 原本的简称为 Personal Home Page[4],是Rasmus Lerdorf 为了要维护个人网页,而用c语言开发的一些CGI工具程序集,来取代原先使用的 Perl 程序。最初这些工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量[5]。他将这些程序和一些表单直译器整合起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。Rasmus Lerdorf 在1995年6月8日将 PHP/FI 公开释出,希望可以透过社群来加速程序开发与寻找错误[6]。这个释出的版本命名为 PHP 2,已经有今日 PHP 的一些雏型,像是类似 Perl 的变量命名方式、表单处理功能、以及嵌入到 HTML 中执行的能力。程序语法上也类似 Perl,有较多的限制,不过更简单、更有弹性。[5]
在1997年,任职于 Technion IIT 公司的两个以色列程序设计师:Zeev Suraski 和 Andi Gutmans,重写了 PHP 的剖析器,成为 PHP 3 的基础,而 PHP 也在这个时候改称为PHP: Hypertext Preprocessor.[5]。经过几个月测试,开发团队在1997年11月释出了 PHP/FI 2,随后就开始 PHP 3 的开放测试,最后在1998年6月正式释出 PHP 3。Zeev Suraski 和 Andi Gutmans 在 PHP 3 释出后开始改写 PHP 的核心,这个在1999年释出的剖析器称为 Zend Engine[7],他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。[5]
在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式释出,2004年7月13日则释出了PHP 5,PHP 5则使用了第二代的Zend Engine[5]。PHP包含了许多新特色,像是强化的面向对象功能、引入PDO(PHP Data Objects,一个存取数据库的延伸函数库)、以及许多效能上的增强[8]。目前PHP 4已经不会继续更新,以鼓励用户转移到PHP 5。[9][10]
2008年PHP 5成为了PHP唯一的有在开发的PHP版本。将来的PHP 5.3将会加入Late static binding和一些其他的功能强化[11][12] 。PHP 6 的开发也正在进行中,主要的改进有移除register_globals[13]、magic quotes 和 Safe mode的功能。[9][14]
[编辑] 版本历程
代表意义
红色 旧版;官方停止支持
黄色 旧版;官方维护中
绿色 目前版本
蓝色 未来版本
主要版本 次要版本 释出日期 说明
1.0 1.0.0 1995年6月8日 正式名称为"Personal Home Page Tools (PHP Tools)",第一次使用了"PHP"的名字。[5]
2.0 2.0.0 1994年4月16日 针对PHP 1.0的改进版,速度更快、体积更小,更容易产生动态网页。[5]
3.0 3.0.0 1998年6月6日 开发方式改成多人共同参与。Zeev Suraski 和 Andi Gutmans 为了这个版本重写了剖析引擎。[5]
4.0 4.0.0 2000年5月22日 改成以Zend引擎作为剖析器,具有两阶段剖析/标签剖析系统等先进功能。[15]
4.1.0 2001年12月10日 加入"超全域变量"(superglobals)功能,包含了$_GET、$_POST、 $_SESSION等[15]
4.2.0 2002年4月22日 默认取消register_globals功能。从网络接收的资料将不会设定成全域变量,增加程序安全性[15]。
4.3.0 2002年12月27日 加入命令行执行档,称为CLI。[15]
4.4.0 2005年7月11日 Added man pages for phpize and php-config scripts.[15]
4.4.8 2008年1月3日 Several security enhancements and bug fixes. Was to be the end of life release for PHP 4. Security updates only until 2008-08-08, if necessary.[16]
4.4.9 2008年8月7日 More security enhancements and bug fixes. The last release of the PHP 4.4 series.[17][18]
5.0 5.0.0 2004年7月13日 Zend Engine II with a new object model.[19]
5.1.0 2005年11月24日 Performance improvements with introduction of compiler variables in re-engineered PHP Engine.[19]
5.2.0 2006年11月2日 Enabled the filter extension by default.[19]
5.2.8 2008年12月8日[20] emergent bug fix[20]
5.2.9 2009年2月26日[21] 这个版本解决了5.2.*的超过了50多个错误和多个安全问题,增加了稳定性。[21]
5.2.9-2(Windows) 2009年3月10日[22] 这个版本解决了在Windows系统下OpenSSL的安全缺陷,与其绑定的OpenSSL版本升级到0.9.8k。[22]
5.3.0 预计2009年第二季[23] 支持命名空间; 使用XMLReader和XMLWriter增强XML支持; 支持SOAP ,[24] 延迟静态绑定, 跳转标签(有限的 goto), 闭包,Native PHP archives
6.0 6.0.0 ??? 支持Unicode; 移除ereg扩展, 'register_globals', 'magic_quotes' 和 'safe_mode'; Alternative PHP Cache;Removal of mime_magic and rewrite of fileinfo() for better MIME support[25]
[编辑] 应用
PHP 是一个应用范围很广的语言,特别是在网络程序开发方面。一般来说 PHP 大多在服务器端执行,透过执行 PHP 的程序码来产生网页提供浏览器读取,此外也可以用来开发命令行脚本程序和使用者端的GUI应用程序。PHP可以在许多的不同种的服务器、操作系统、平台上执行,也可以和许多数据库系统结合。使用 PHP 不需要任何费用,官方组织 PHP Group 提供了完整的程序源代码,允许使用者修改、编译、扩充来使用。[26]
[编辑] 语法
PHP的语法参考了Perl、C语言,而且可以整合在HTML之中,以下是一个简单的Hello World程序:
<?php
echo 'Hello World!';
?>
PHP剖析引擎只剖析<?php到?>之间的程序码,而不包含在<?php到?>之间的内容则会直接送出,所以可以用以下的方式来将PHP程序码嵌入在HTML之中:
<?php
//-PHP程式码
?>
html内容
<?php
//-PHP程式码
?>
但是在判断语句中的HTML代码并不会被直接送出:
<?php
if (false) {
?>
HTML Code
<?php
}
?>
PHP可以用三种注解的形式:C与C++所使用的“/*...*/”与“//”,和Perl的“#”。
[编辑] 类型
PHP主要有以下四种变量类型:
整数 (integer)
浮点数 (float)
布尔数 (boolean)
字串 (string)
两种复合类型:
阵列 (array)
物件 (object)
两种特殊类型
NULL
资源 (resource)[27]
[编辑] 变量
PHP中,变量以“$”后接变量名称来表示。变量名称区分大小写。有效的变量名称以字母或底线开头,后接任意数目的字母、数字或底线。[28]
[编辑] 面向对象
PHP从PHP 3开始有了基本的面向对象的特性,但直到PHP 5将面向对象部份重新改写之后,PHP的面向对象功能才比较完善。现在PHP可以说是一个有完整面向对象功能的语言。
[编辑] PHP相关资源
[编辑] 函数库
主条目:PHP函数库列表
内建多样化的函数是PHP主要的特点之一,这些开放程序码的函数提供了各种不同的功能,例如档案处理、FTP、字串处理、等等。这些函数的使用方法和C语言相近(例如printf),这也是PHP广为流行的原因之一。
除了内建的函数之外,PHP也提供了很多延伸函数库(extension),像是各种数据库连接函数、资料压缩函数、图形处理等等。有些延伸函数库需要从PECL(PHP Extension Community Library)取得。
[编辑] 源代码编码和加速
PHP源代码是可以直接读取的,即使放到服务器上执行也是一样。虽然让PHP多了弹性,但相对的会造成安全危机和性能下降的问题。
透过PHP编码器,可以保护PHP的源代码不被读取(对商业软件来说特别有需求),也可以提升执行的效能。有许多公司或团体开发PHP的编码器,将PHP程序编译成字节码(byte code),再透过服务器上安装对应的程序来执行PHP脚本。
除了透过编码器加速之外,PHP还可以透过动态的快取机制来提升速度,加速工具有商业版的,例如Zend Platform,也有开放源代码的加速软件如eAccelerator、APC、XCache。
[编辑] 样板引擎
样板引擎让PHP应用程序可以做逻辑和使用接口上的分离,让程序开发更容易进行,目前比较受欢迎的样板引擎是PHP官方开发的Smarty。不过样板引擎有效能上的争议,因为PHP本身就是一个样板引擎,使用样板引擎反而变成“重新发明了轮子”(reinventing the wheel)。样板引擎最主要的好处就是让不懂PHP程序码的人也可以参与使用接口的开发,因为样板引擎的语言远比PHP简单。
[编辑] 未来发展
[编辑] PHP 5.3
命名空间(namespaces)原本预计在PHP 6提供支持,现在可能改至PHP 5.3就支持[29
关于php闭包速度的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php闭包速度 php闭包函数的实际应用的详细内容...