0

0

PHP 的比较运算与逻辑运算,php运算逻辑_PHP教程

php中文网

php中文网

发布时间:2016-07-12 08:52:57

|

1373人浏览过

|

来源于php中文网

原创

PHP 的比较运算与逻辑运算,php运算逻辑

1、以下值用 empty() 被判断为true:

未赋值变量、未声明变量、0、"0"、""、false、null、空数组 array() 、对象的魔术方法 __get() 返回的值

在低于 PHP5.0 的版本中,没有任何属性的对象也被 empty 判断为 true

注意:empty() 只接受变量或变量的索引值或属性值,不能直接传入常量,也不能传入运算表达式,PHP 5.5 之后支持表达式

立即学习PHP免费学习笔记(深入)”;

 

2、被 isset() 判断为 false 的值:未赋值变量、未声明变量、null、__get() 返回的值,接受的参与 empty()一样,不能是常量和表达式.

3、不同类型的数据比较

如果有一个是 boolean 型或者 null, 转换成 boolean 比较,

否则如果有一个是 number,转换成 number 比较

否则如果有一个是 string,转换成 string 比较

object 类型总是大于 array  类型和标量类型,array 类型总是大于 标量类型

 

注意这些比较结果:

复制代码
       <span>//</span><span>0开头的数字字符串转数字时不会按八进制转换,而是简单地丢弃把 '0' 丢弃按数字进行比较,</span>

      123=='0123' <span>//</span><span>true</span>
      "123"<"0124124" <span>//</span><span>true,0开头的数字字符串直接按十进制数字比较而非八进制</span>

      "012" == 10 <span>//</span><span> false</span>
       012 == 10  <span>//</span><span> true</span>
       0x12 == 18  <span>//</span><span> true</span>
       "0x12" == 18 <span>//</span><span> true</span>
 

 <span>false</span> < <span>true</span>; <span>//</span><span>true</span>
 2><span>true</span>; <span>//</span><span> false</span>
 2==<span>true</span>; <span>//</span><span> true </span>
 <span>null</span>==0; <span>//</span><span>true</span>
-1<0;<span>//</span><span>true</span>
-1<<span>null</span>;<span>//</span><span>false ,-1 转 bool 是true</span>
复制代码

 

4、类型转换规则

 empty() 判断为 true 的值转换为 boolean 型得到 false ,反之,得到 true  ( __get() 返回的值需按具体的值判断)

被 empty() 判断为 true 的值转换成 number 得 0,非空的 array 转 number 得到1  ( __get() 返回的值需按具体的值判断)

复制代码
<span>class</span><span> Test{
   </span><span>private</span> <span>$k</span>=1<span>;
   </span><span>public</span> <span>function</span> __get(<span>$propertyName</span><span>){
       </span><span>return</span> 123<span>;
   }
}

</span><span>$obj</span> = <span>new</span><span> Test();
</span><span>echo</span> json_encode(<span>empty</span>(<span>$obj</span>->k)); <span>//</span><span>true</span>
<span>echo</span> json_encode(<span>isset</span>(<span>$obj</span>->k)); <span>//</span><span>false</span>
<span>echo</span> json_encode((bool)(<span>$obj</span>->k)); <span>//</span><span>true</span>
复制代码

 

几个string 转 number 的场景: 

复制代码
<span>echo</span> 'abc'*1 ; <span>//</span><span>0 </span>
<span>echo</span> '012'*1; <span>//</span><span>12  乘法:可以转换十六进制数,不是数字开头则返回 0</span>
<span>echo</span> '0x12.123'*1; <span>//</span><span>18</span>

<span>echo</span> (<span>float</span>)'0x12' ;<span>//</span><span>0 </span>
<span>echo</span> (int)'0x12' ; <span>//</span><span>0 不能处理十六进制数</span>
<span>echo</span> (<span>float</span>)'12abc'; <span>//</span><span>12 截取左侧字符串</span>
<span>echo</span> (<span>float</span>)'abc'; <span>//</span><span> 0 不是数字返回0</span>

<span>is_numeric</span>('0x123'); <span>//</span><span>true 能识别十六进制数</span>
<span>is_numeric</span>('0x123.123'); <span>//</span><span>false 识别目标是整个字符串而非截取前面一部分</span>
复制代码

 

 

 

string 转 number 时截取左侧的数字字符串进行转换,如果没有则返回 0.

 

 

其他数据转字符串:

复制代码
<span>//几个转字符串的值</span>
(<span>string</span>)0 ; <span>//</span><span> "0"</span>
(<span>string</span>)<span>true</span>; <span>//</span><span> "1"</span>
(<span>string</span>)<span>false</span>; <span>//</span><span> ""</span>
(<span>string</span>)<span>null</span>; <span>//</span><span> ""</span>
(<span>string</span>)<span>array</span>(); <span>//</span><span> "<span>Array</span>"</span>
复制代码

数组可以直接进行字符串拼接操作但不能进行数学运算.

object 类型转换成 boolean 总是 true, object 类型不能转换成 number 和 string ,因此也不能进行字符串拼接和数学运算

标量转换成 array 的方式是将数组第一个元素设置成标量,返回该数组。

标量转换成 object 得到一个 stdClass 类的实例,标量的值被赋给名为 scalar 的属性: Object(    [scalar] => 234)

array 转 object 得到一个 stdClass 类的实例,数组的 key 为实力的属性名。

object 转 array 有点复杂:

           方法、静态属性、类常量被丢弃

           保护属性名称前面被被加上一个 "*"

           私有属性前面被加上类名作为前缀(大小写与类名完全相同)

    这些前缀的前后都加上空字符

    这些前缀的前后都加上空字符 \0

Neon AI
Neon AI

Neon AI帮助开发人员创建会话式AI应用程序和设备

下载

例如一个由 object 转换来的 array 为:

<span>Array</span>(    [*v] => 444    [bf] => 333    [bk] => 99977    [Ak] => 999    [*p] => 888    [a2] => 22)

 

原对象中有: 

           public 属性 a2, protected 属性 v、p ,这些属性来自哪个类无法鉴别(被重写则取子类的属性)

          来自类 b 的 private 属性 f、k,(从数组 key 来看,以bf为例,无法判断他是属性名为bf,还是来自类b的私有属性f)

          来自类 A 的 private 属性 k 

          无法鉴别 b 和 A 哪个是子类哪个是父类(仅从 array 的key来看,也无法推断出原对象构造自哪个类)

 

例子:

复制代码
<span>class</span><span> A {
    </span><span>private</span> <span>$A</span> = 'private property, $A of class A'; <span>//</span><span> This will become '\0A\0A'</span>
    <span>protected</span> <span>$C</span> = 'protected property, $C of class A'<span>;
}

</span><span>class</span> B <span>extends</span><span> A {
    </span><span>private</span> <span>$A</span> = 'private property, $A of class B'; <span>//</span><span> This will become '\0B\0A'</span>
    <span>public</span> <span>$AA</span> = 'public property, $AA of class B'; <span>//</span><span> This will become 'AA'</span>
    <span>protected</span> <span>$B</span> = 'protected property, $B of class B'<span>;
}

</span><span>$arr</span> = (<span>array</span>) <span>new</span><span> B();

</span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$key</span> => <span>$value</span><span>) {
    </span><span>echo</span> '<br />'<span>;
    </span><span>echo</span> <span>$key</span> .',length: '.<span>strlen</span>(<span>$key</span>).' value: '.<span>$value</span><span>;
}</span>
复制代码

 

输出结果:

BA,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> B
AA</span>,length: 2 value: <span>public</span> property, <span>$AA</span> of <span>class</span><span> B
</span>*B,length: 4 value: <span>protected</span> property, <span>$B</span> of <span>class</span><span> B
AA</span>,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> A
</span>*C,length: 4 value: <span>protected</span> property, <span>$C</span> of <span>class</span> A

 

 

5、 逻辑运算总是返回 true 或 false (写多了 javascript 的人要注意),逻辑运算符优先级从高到低 为 &&、 ||、 and、 or ,逻辑运算符的短路效果可以使用语句中,但记住他们不会像 javascript 中那样返回一个 不是 boolean 类型的值,在表达式中使用要注意。

复制代码
<span>$a</span> = 1<span>;
</span><span>$b</span>=0<span>;
</span><span>$b</span> and <span>$a</span> = 100<span>;
</span><span>echo</span> <span>$a</span>; <span>//</span><span>1</span>
<span>$b</span> || <span>$a</span> = 200<span>;
</span><span>echo</span> <span>$a</span>; <span>//</span><span>200</span>
复制代码

 

 

 

6、switch 的比较不是 "===" 而是 "==" (在 javascript 中是 "===")

 

7、 在 php4 中,object 之间的比较方式与 array 相同,在 php5 中 , object 类型间的 "==" 比较为 true的前 提是,他们属于同一个类的实例(当然还要进行属性的比较,这类似标量的"==="比较),object 间的 "===" 比较为 true 的前提是他 们 就是同一个对象。

 

在 PHP4 中 ,不包括任何成员变量的对象 被 empty() 判断为 true

字符串偏移 offset 取字符的 empty() 判定: 取对应 offset 的字符进行判断,在PHP5.4 以前,使用索引从字符串中取字符时会先将索引进行取整,因此左侧不包含数字的字符串都被转换成0,PHP5.4之后,不再对非整形格式的字符串索引进行取整,因此判断为 true, 同理,isset() 判定为false. 如:

复制代码
<span>$str</span> = 'ab0d'<span>;
</span><span>empty</span>(<span>$str</span>[0]); <span>//</span><span>false</span>
<span>empty</span>(<span>$str</span>[0.5]); <span>//</span><span>false  索引被向下取整 为 0</span>
<span>empty</span>(<span>$str</span>["0.5"]); <span>//</span><span>false 索引被向下取整 为 0,PHP5.4之后不取证,判定为 true </span>
<span>empty</span>(<span>$str</span>[2]); <span>//</span><span>true ,取得的字符为 "0"</span>
<span>empty</span>(<span>$str</span>["3"]); <span>//</span><span>false ,取得的字符为 "d"</span>
<span>empty</span>(<span>$str</span>[4]); <span>//</span><span>true ,索引超出范围,notice 警告,但 empty() 会忽略警告</span>
<span>empty</span>(<span>$str</span>['a']); <span>//</span><span> false ,左侧不包含数字字符串索引 PHP5.4之前被处理为 $str[0],PHP5.4之后,直接为判定 true </span>
复制代码

 

无论是“不等于”还是”==“ ,不要在 PHP 的跨类型数据比较中使用”传递性“:

$a == $b; //true

$b == $c; //true

并不能说明 $a == $c 为 true

 

数组的比较方法

复制代码
<span>//</span><span> 数组是用标准比较运算符这样比较的</span>
<span>function</span> standard_array_compare(<span>$op1</span>, <span>$op2</span><span>)
{
    </span><span>if</span> (<span>count</span>(<span>$op1</span>) < <span>count</span>(<span>$op2</span><span>)) {
        </span><span>return</span> -1; <span>//</span><span> $op1 < $op2</span>
    } <span>elseif</span> (<span>count</span>(<span>$op1</span>) > <span>count</span>(<span>$op2</span><span>)) {
        </span><span>return</span> 1; <span>//</span><span> $op1 > $op2</span>
<span>    }
    </span><span>foreach</span> (<span>$op1</span> <span>as</span> <span>$key</span> => <span>$val</span><span>) {
        </span><span>if</span> (!<span>array_key_exists</span>(<span>$key</span>, <span>$op2</span><span>)) {
            </span><span>return</span> <span>null</span>; <span>//</span><span> uncomparable</span>
        } <span>elseif</span> (<span>$val</span> < <span>$op2</span>[<span>$key</span><span>]) {
            </span><span>return</span> -1<span>;
        } </span><span>elseif</span> (<span>$val</span> > <span>$op2</span>[<span>$key</span><span>]) {
            </span><span>return</span> 1<span>;
        }
    }
    </span><span>return</span> 0; <span>//</span><span> $op1 == $op2</span>
}
复制代码

 

 

 

8、三元运算符 ?: ,跟其他大多数编程语言不一样,PHP 的三元运算符是左结合的!

复制代码
    <span>$arg</span> = 'T'<span>;    
    </span><span>$vehicle</span> = ( ( <span>$arg</span> == 'B' ) ? 'bus' :<span>    
                 ( </span><span>$arg</span> == 'A' ) ? 'airplane' :<span>   
                 ( </span><span>$arg</span> == 'T' ) ? 'train' :<span>    
                 ( </span><span>$arg</span> == 'C' ) ? 'car' :<span>    
                 ( </span><span>$arg</span> == 'H' ) ? 'horse' :    
                 'feet'<span> );    
    </span><span>echo</span> <span>$vehicle</span>;   <span>//</span><span>horse</span>
复制代码


 

三元运算表达式被划分为

( <span>$arg</span> == 'B' ) ? 'bus' : ( <span>$arg</span> == 'A'<span> ) 
                                    </span>? 'airplane' : ( <span>$arg</span> == 'T'<span> ) 
                                                             </span>? 'train' : ( <span>$arg</span> == 'C'<span> )
                                                                               </span>? 'car' : ( <span>$arg</span> == 'H'<span> )
                                                                                                    </span>? 'horse' : 'feet' ;   

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1125682.htmlTechArticlePHP 的比较运算与逻辑运算,php运算逻辑 1、以下值用empty()被判断为true: 未赋值 变量、未声明变量、 0、"0"、""、false、null、空数组array()...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号