为什么有些人php代码最后不加?>
为什么有些人php代码最后不加“?>”呢?起初我也不知道,后来百度了才知道。网上看教程,别人都有“?>”结束标签,但是看别人的源码很多人都没有加,原来不加结束标签可以避免尾部的空白字符意外输出,对代码产生某些不必要的影响。
代码如下 | 复制代码 |
<?php /** * 下面提到的代码在PHP5.3以上版本运行通过. */ function callback($callback) { $callback(); } //输出: This is a anonymous function.<br />/n //这里是直接定义一个匿名函数进行传递, 在以往的版本中, 这是不可用的. //现在, 这种语法非常舒服, 和javascript语法基本一致, 之所以说基本呢, 需要继续向下看 //结论: 一个舒服的语法必然会受欢迎的. callback(function() { print "This is a anonymous function.<br />/n"; }); //输出: This is a closure use string value, msg is: Hello, everyone.<br />/n //这里首先定义了一个闭包, 这次户口本上有名字了... //use, 一个新鲜的家伙... //众所周知, 闭包: 内部函数使用了外部函数中定义的变量. //在PHP新开放的闭包语法中, 我们就是用use来使用闭包外部定义的变量的. //这里我们使用了外部变量$msg, 定义完之后, 又对其值进行了改变, 闭包被执行后输出的是原始值 //结论: 以传值方式传递的基础类型参数, 闭包use的值在闭包创建是就确定了. $msg = "Hello, everyone"; $callback = function () use ($msg) { print "This is a closure use string value, msg is: $msg. <br />/n"; }; $msg = "Hello, everybody"; callback($callback); //输出: This is a closure use string value lazy bind, msg is: Hello, everybody.<br />/n //换一种引用方式, 我们使用引用的方式来use //可以发现这次输出是闭包定义后的值... //这个其实不难理解, 我们以引用方式use, 那闭包use的是$msg这个变量的地址 //当后面对$msg这个地址上的值进行了改变之后, 闭包内再输出这个地址的值时, 自然改变了. $msg = "Hello, everyone"; $callback = function () use (&$msg) { print "This is a closure use string value lazy bind, msg is: $msg. <br />/n"; }; $msg = "Hello, everybody"; callback($callback); //输出: This is a closure use object, msg is: Hello, everyone.<br />/n //闭包中输出的是之前被拷贝的值为Hello, everyone的对象, 后面是对$obj这个名字的一个重新赋值. //可以这样考虑 //1. obj是对象Hello, everyone的名字 //2. 对象Hello, everyone被闭包use, 闭包产生了一个对Hello, everyone对象的引用 //3. obj被修改为Hello, everybody这个对象的名字 //4. 注意, 是名字obj代表的实体变了, 而不是Hello, everyone对象, 那自然闭包的输出还是前面的Hello, everyone $obj = (object) "Hello, everyone"; $callback = function () use ($obj) { print "This is a closure use object, msg is: {$obj->scalar}. <br />/n"; }; $obj = (object) "Hello, everybody"; callback($callback); //输出: This is a closure use object, msg is: Hello, everybody.<br />/n //还是按照上面的步骤, 按部就班的来吧: //1. obj名字指向Hello, everyone对象 //2. 闭包产生一个引用指向Hello, everyone对象 //3. 修改obj名字指向的对象(即Hello, everyone对象)的scalar值 //4. 执行闭包, 输出的自然是Hello, everybody, 因为其实只有一个真正的对象 $obj = (object) "Hello, everyone"; $callback = function () use ($obj) { print "This is a closure use object, msg is: {$obj->scalar}. <br />/n"; }; $obj->scalar = "Hello, everybody"; callback($callback); //输出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />/n //闭包引用的是什么呢? &$obj, 闭包产生的引用指向$obj这个名字所指向的地址. //因此, 无论obj怎么变化, 都是逃不脱的.... //所以, 输出的就是改变后的值 $obj = (object) "Hello, everyone"; $callback = function () use (&$obj) { print "This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />/n"; }; $obj = (object) "Hello, everybody"; callback($callback); /** * 一个利用闭包的计数器产生器 * 这里其实借鉴的是python中介绍闭包时的例子... * 我们可以这样考虑: * 1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1. * 2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用. * 3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用, * 它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的 * 变量. * 4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的. * 5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器. * 结论: 此函数可以用来生成相互独立的计数器. */ function counter() { $counter = 1; return function() use(&$counter) {return $counter ++;}; } $counter1 = counter(); $counter2 = counter(); echo "counter1: " . $counter1() . "<br />/n"; echo "counter1: " . $counter1() . "<br />/n"; echo "counter1: " . $counter1() . "<br />/n"; echo "counter1: " . $counter1() . "<br />/n"; echo "counter2: " . $counter2() . "<br />/n"; echo "counter2: " . $counter2() . "<br />/n"; echo "counter2: " . $counter2() . "<br />/n"; echo "counter2: " . $counter2() . "<br />/n"; ?> |
注意:
优先级是:! > && > || > and > xor > or
还要注意的是:尽管 ! 比 = 的优先级高,PHP 仍旧允许类似如下的表达式:if (!$a = foo()),在此例中 foo() 的输出被赋给了 $a。
先来看手册很赞同手册中的一句话:使用括号可以增强代码的可读性。
例子 | 名称 | 结果 |
---|---|---|
$a and $b | And(逻辑与) | TRUE,如果 $a 与 $b 都为 TRUE。 |
$a or $b | Or(逻辑或) | TRUE,如果 $a 或 $b 任一为 TRUE。 |
$a xor $b | Xor(逻辑异或) | TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。 |
! $a | Not(逻辑非) | TRUE,如果 $a 不为 TRUE。 |
$a && $b | And(逻辑与) | TRUE,如果 $a 与 $b 都为 TRUE。 |
$a || $b | Or(逻辑或) | TRUE,如果 $a 或 $b 任一为 TRUE。 |
例
在php中,”|”为php位运算符,”||”为逻辑运算符
位运算符代码:
代码如下 | 复制代码 |
<?php $a=0; $b=0; if($a=3 | $b=3){ $a++; $b++; } echo $a.','.$b; //输出 4,4 ?> |
对比一下代码,以下为逻辑运算符的代码:
代码如下 | 复制代码 |
<?php $a=0; $b=0; if($a=3 || $b=3){ $a++; $b++; } echo $a.','.$b; //输出 1,1 ?> |
在上述两个例子中,第一个例子中,”$a=3 | $b=3″,由于”|”的优先级高于赋值运算符,所以运算顺序可写为 “$a=(3 | $b=3)”,首先$b被赋值为3,而$a被二进制数0100 | 0100 的结果赋值,仍为0100,所以$a此时被赋值为0100,也就是十进制的3,赋值成功,返回true,执行if代码块中的内容,$a自加,$b也自加, 所以,$a=4,$b=4
第二个例子中,同样可以看做是”$a = (3 || $b = 3)”,首先3||$b=3返回true,”||”造成短路,”||”前的3已经为真,”$b=3″不再执行,所以此时$b仍为0,$a为布尔类型的 true,,赋值成功,返回true,执行if代码块中的内容,$a++还为true,$b++为1,所以,$a=1,$b=1
设置方法很简单,只要修改php.ini中的以下键的值:
session.save_handler = memcache
session.save_path = 'tcp://192.168.0.1:11211'
#有多个时直接用","分隔即可
要测试一下是否真的用上了memcache,可以先获取使用的PHPSESSID,然后将其作为KEY用memcach去读一下,就知道了。
使用memcache做php的session handler好处
使用内存存放session信息,不经过磁盘,数据库等,速度快
可以多台机器共用一个/组memcached服务器,达到多台机器共享session信息,方便多机集群的session问题处理。
…
使用memcache做为php的session handler坏处
首先memcached的服务必须正常工作,否则php的session相关功能将不起作用,这样php的处理就多了一层外面的依赖。
由于memcached是使用内存的,这样当用户量比较大时,就可能由于内存方面原因导致session时长上的问题,session的实际失效时长达不到设定的失效时长(由于memcached在内存不够下的处理机制决定)
由于memcached的内存管理机制,当session存储的数据超过1MB的时候有数据丢失问题(不过一般不会有人在session中存放这么多的信息吧)。
…
根据以上的一些情况决定自己在实际环境中是否使用memcache做为php的session handler
for 循环语句是 PHP 语言中最复杂的一种循环语句。它的语法如下:
for (expr1; expr2; expr3)statement
例
代码如下 | 复制代码 |
<html><body><?phpfor ($i=1; $i<=5; $i++){ echo $i ;}?></body></html> 该实例返回的显示结果是: 12345 |
下面说说for语句几种有用的变型。
1、无限循环
首先是人尽皆知的无限循环(亦可称“死循环”)。由于空表达式null在语法上是有效的,所以我们可以把for语句的三个表达式留空,这样就会产生不断执行for嵌套语句的效果。
代码如下 | 复制代码 |
<?php |
虽然有一些任务会使用到无限循环,但是大多数程序任务,特别是PHP所能涉及的领域,在使用无限循环时都会添加一些终止循环的条件。
代码如下 | 复制代码 |
<?php |
2、使用空表达式
接下来就是说说在初始化语句expr1中使用null语法,留空expr1最常见的作用就是完成更为复杂的初始化工作。
代码如下 | 复制代码 |
<?php for (;$i < 10;$i++) { |
同样道理,迭代表达式expr3也可能留空,也可以利用这点编写更为复杂的迭代式,比如说根据不同的条件调用不同的迭代式。
而for语句中的条件语句expr2留空则是上面所说的无限循环,当然也可以添加一些更为复杂的条件去判断什么时候跳出循环,在此不在重复。
3、多重循环
使用多重循环来控制多个变量也是在for语句中使经常被忽略的一个特性。如下面的例子,在一般的任务中用到的一般会是双重循环,三重以上的循环一般意义不大。
代码如下 | 复制代码 |
<?php 以上代码将输出: 0 + 10 = 10 |
4、更为复杂的表达式
如果把for语句的三个表达式写得复杂一些,则可以用于优化算法。甚至可以使用没有循环体的for语句来完成一些任务。比如计算累加或阶乘:
代码如下 | 复制代码 |
<?php //计算1-5的阶乘结果,斌值到$j ?> |
利用for循环返回近三个月的数据。我们都知道,利用str_pad(intval($month),2,0,STR_PAD_LEFT)可以很方便的获得上月的时间。
代码如下 | 复制代码 |
<?php $y = date('Y');//获取当前时间年份 $m = date('m');//获取当前时间月份 if($m == 1) $time = ($y-1).'-12';//如果是1月份,则上个月就是去年的12月,所以这里的年份要减去1 else $time = $y."-".str_pad(intval($m-1),2,0,STR_PAD_LEFT);//获取上个月时间 ?> |
如果需要前三个月数据的话,显然这样的处理方式还不够,且类似的代码反复执行,效率不高,这时候选择for循环就对了。
代码如下 | 复制代码 |
<?php //for循环变量说明 $sm为起始月份 $em为结束月份 $ny为实际年份 if($m == 1) { $sm = 11;//当前月份是1月,以前三个月计算的话,起始月份就是去年11月 $em = 13;//这里做为for循环结束标记,结束月份是今年1月,加上12只是便于循环 } elseif($m == 2) { $sm = 12;//同上 $em = 14; } else { $sm = $m - 3; $em = $m; } for($x=$sm;$x<$em;$x++) { if($m == 1 || $m == 2) { if($x >= 11) $ny = $y - 1;//实际年份是去年 if($x >= 13) $x = $x - 12;//实际月份是今年 } else $ny = $y; //年份、月份都顺利得到了,后面就好办了…… } ?> |
相关文章
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
- 一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
- 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
- 本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
- 本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。 当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点...2013-10-13
- 小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04php导出csv格式数据并将数字转换成文本的思路以及代码分享
php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07