喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
     
标题: [经验] 为什么报错使用or die  
 
unspace (未知空间)
版主
Rank: 7Rank: 7Rank: 7
百万富翁


UID 67567
精华 0
积分 48934
帖子 5039
金钱 47847 喜悦币
威望 0
人脉 1087
阅读权限 100
注册 2005-12-28
来自 吉林
状态 离线
为什么报错使用or die

今天有个MM问我,为什么这样用
mysql_connect('locahost','root','') or die('数据库连接失败');

这个问题我也想过很多次,忘了是哪次得到了让自己非常满意的答案,现在就把我认为的理由分享给大家

之所以 用 or 可以达到,当函数错误后,执行or后面的函数是因为:
1.逻辑运算的运算顺序是从左向右
2.or运算符的左结合性
3.or运算中,如果运算时有值为真了,则整个表达式为真,后面不需要运算

终合上面三个因素,当or左侧函数运行正常(返回非假值),则不会执行后面的函数
这里利用了or的这个特性,将die(终止并输出函数)用于此处,巧妙的实现了函数异常而报错的功能

根据上面的分析,想到
如果左侧函数就是返回假的函数,或者无返回值的函数,应该也是执行后面的函数

mysql_connect()执行错误,并不是这个函数本身执行错误了,如果是它本身执行错误是PHP的系统错误
它仅仅是返回了一个假值而已

顺便说一下在PHP中的假值都有哪些,除了这些都是真值
0 false array() null '' ""
零 假 空数组 NULL 空字符串
应该还有空对象,但不知道怎么表示

如果有疏漏,大家补充

似乎我说的还不够多,还有的地方需要再说一下。
使用die是为了终止程序,并输出错误,一般在我们学习的时候会使用这种方法,但在具体项目中很少这样用。
因为项目中即使报错,也不想使用白屏黑字去报错,都希望使用项目本身标准的报错页去报告
那么在or 的后面,很多人会使用自定义函数(方法)来报错、以及记日志等操作。
给个例子大家玩玩,这个例子也说明了print是有返回值的

<?php
function test(){
    echo 
"0";
    return 
false;
}

test() or print('1') or print('2');
?>
[ 本帖最后由 unspace 于 2007-1-25 01:07 PM 编辑 ]




7月1日起,北京市低保、最低工资标准、失业保险、工伤保险、基本养老金5项社会保障标准均将全部上调。其中,最低工资标准增加70元,提高到800元。
2007-1-24 03:31 PM#1
查看资料  访问主页  Blog  发短消息  顶部
 
Tbreeze
注册会员
Rank: 2
一般会员



UID 15397
精华 0
积分 56
帖子 58
金钱 56 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2002-7-22
来自 hz
状态 离线
[推荐阅读] 彻底解决南北互连互通的问题 西安 铁通服务器托管 铁通服务器租用
die -- Equivalent to exit()
2007-1-24 03:37 PM#2
查看资料  访问主页  发短消息  QQ  顶部
 
starDust
注册会员
Rank: 2



UID 72487
精华 0
积分 135
帖子 153
金钱 135 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-28
状态 离线
[推荐阅读] 一个跟类有点相关的问题
这样只解析了"可以"这样用,并没有解答"为什么要这样用"



原来是基因改造了世界
2007-1-24 03:40 PM#3
查看资料  发短消息  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4842
帖子 1716
金钱 4832 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 高手请指教!!!!!!


function a(){return false;}
function b(){return false;}
function c(){echo '123<br>';return true; }
a() or b() or c();
(a() or b() or c());
$a=(a() or b() or c());
echo $a;
a() or b() or (456>1) or c();
a() or b() or (456<1) or c();
并不一定非要用die();

你可以自己写其他函数,偶的理解是,这种写法其实就是 or 运算。

第一种 a() or b() or c();  这样的话 a()为false,b()为false,唯有c()为true,所以符合 or 条件,最终输出了 123;

第二种 (a() or b() or c()); 看起来和if()判断一样,其实和第一种没区别,结果也是123,只是可以延伸为 第三种,获取值

第三种 $a 当然输出 true了,所以为 1

第四种 抛弃函数,因为和if道理相似,所以 456>1为true,就没机会执行后面的c了,就没输出

第五种 因为456<1为false ,所以后面c还要检查一下,结果输出了123

[ 本帖最后由 剑枫 于 2007-1-24 04:06 PM 编辑 ]




在场外支持奥运.....
2007-1-24 03:59 PM#4
查看资料  访问主页  发短消息  QQ  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4842
帖子 1716
金钱 4832 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 很久没来过村里了,为什么?一个字:慢!
当然了,既然有or运算,也可以用 and 等运算,大家可以试试,和if(a or b or c)  性质一样的



在场外支持奥运.....
2007-1-24 04:11 PM#5
查看资料  访问主页  发短消息  QQ  顶部
 
迎风
高级会员
Rank: 4
一二三四五,上山打老鼠


UID 66573
精华 0
积分 819
帖子 886
金钱 819 喜悦币
威望 0
人脉 0
阅读权限 50
注册 2005-9-11
状态 离线
[推荐阅读] 请教mysql两个表union查询怎么排出重复?
写起来顺....
2007-1-24 04:34 PM#6
查看资料  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.030199 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP