php中的逻辑运算符使用方法介绍
注意:
优先级是:! > && > || > 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代码最后不加“?>”呢?起初我也不知道,后来百度了才知道。网上看教程,别人都有“?>”结束标签,但是看别人的源码很多人都没有加,原来不加结束标签可以避免尾部的空白字符意外输出,对代码产生某些不必要的影响。
设置方法很简单,只要修改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; //年份、月份都顺利得到了,后面就好办了…… } ?> |
语法
foreach ( array_expression as $key => $value ) statement
实例1:
代码如下 | 复制代码 |
<?php |
通过foreach不仅可以获得元素的值也可以获得键名,结构形式:
代码如下 | 复制代码 |
foreach( $color as $c) echo $c ."<br>"; 或 foreach( $color as $key => $c) echo $key.$c ."<br>"; |
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以 是下标值,也可以是字符串。比如book[0]=1中的"0",book[id]="001"中的"id".
下面来仔细探讨下foreach使用中的一些问题。
普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即
代码如下 | 复制代码 |
$arr = array(0,1,2,3,4,5); foreach($arr as $value){ // 12345 |
但如果$arr是引用的话,情况则不同了,我们用代码来说明问题
代码如下 | 复制代码 |
$arr = array(0,1,2,3,4,5); foreach($arr as $value){ // 0 |
这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。
如果$value是引用,而$arr不是引用,其结果是一样的,同样$value是指向原数据的而不是copy。
代码如下 | 复制代码 |
foreach($arr as &$value){ // 结果是: 0 |
还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用:
代码如下 | 复制代码 |
global $arr; foreach($arr as $value){ // 结果是: 0 |
如果两次循环一个数组,一定不能这样写
代码如下 | 复制代码 |
foreach($arr as &$value){} |
这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替
代码如下 | 复制代码 |
//solution 1 |
防止foreach出现未定义情况,尽量这样来写foreach
代码如下 | 复制代码 |
foreach((array)$arr as $value) {} |
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
- Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
- mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
- 这篇文章介绍了c#的异或运算符,有需要的朋友可以参考一下...2020-06-25
- 轻松学习C#的运算符,对C#的运算符感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的运算符。...2020-06-25
Postman安装与使用详细教程 附postman离线安装包
这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05