解析PHP中一些可能会被忽略的问题


Posted in PHP onJune 21, 2013

1.echo和print的区别
PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的。echo输出后没有返回值,但print有返回值,当其执行失败时返回flase。因此可以作为一个普通函数来使用,例如执行下面的代码后变量$r的值将为1。
$r = print "Hello World";
这意味着print可用在一些复杂的表达式中,而echo则不行。但是,因为echo语句不要求返回任何数值,所已在代码中echo语句的运行效率要略微快于print语句。

2.include与require的区别
include()与require()的功能也基本相同(包含),但在用法上也有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。例如在下面代码中,如果变量$a为真,则将包含文件a.php:
if($a){
include("a.php");
}
而require()则和include()不同,不管$a取何值,下面的代码将把文件a.php包含进文件里:
if($a){
require("a.php");
}
在错误处理方面,使用include语句,如果发生包含错误,程序将跳过include语句,虽然会显示错误信息但是程序还是会继续执行!但requre却会给你来个致命错误。
当然,从字面意思上我们也可以理解七分:requre是很强硬的请求、要求的意思。

3.require_once()和include_once()语句
题外话了,因为长的像,简单require_once()和include_once()语句分别对应于require()和include()语句。require_once() 和include_once()语句主要用于需要包含多个文件时,可以有效地避免把同一段代码包含进去而出现函数或变量重复定义的错误。

4.空字符串('')和NULL的区别
PHP中空字符串和NULL都是以值为0存储的,但是他们的类型并不一样,你可以试一下echo gettype('');和echo gettype(NULL);你会发现他们打印出来的分别是string和NULL,当然还有0也容易混淆,你可以试试echo gettype(0);打印一下类型,会发现0的类型是integer(整型),可见字符串('')、NULL和0是“等值”但不等类型。

5.isset和 empty的区别
从字面意思上我们就可以明白:empty是判断一个变量是否为“空”,而isset 则是判断一个变量是否已经设置。但是这里有一点绝对要注意起来:当一个变量值为0,empty 认为这个变量同等于空,即相当于没有设置。比如当我们检测$id 变量的时候,当$id=0 ,用empty和isset来检测变量$id是否已经配置,两都将返回不同的值:empty 认为没有配置,isset 则能够取得 $id 的值,看下边例子:
$id=0;
empty($id)?print "我是空的":print "我是$id ."; //结果:我是空的
!isset($id)?print "我是空的":print "我是$id .";//结果:我是0
 
6.==(等)和===(恒等)的区别
回顾上面第四条空字符串("")和NULL的区别,再来看一个例子:
'' == NULL;
'' === NULL;
运行之后你会发现第一个为true,而第二个则为false!可见==只是比较值是否相等,而===则不但比较值,还会比较类型,更为严格。

7.self :: 和 this-> 的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->。

另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this。

8.strstr() 与 strpos() 的区别
stristr() 不区分大小写 strstr() 区分大小写
函数查找字符串在另一个字符串中第一次出现的位置。
如果成功,则返回字符串的其余部分(从匹配点)。如果没有找到该字符串,则返回 false。
stripos() 不区分大小写 strpos() 区分大小写
函数返回字符串在另一个字符串中第一次出现的位置。
如果没有找到该字符串,则返回 false。
经测试证明如果只是单纯查找判断是否存在则strpos()的执行效率要大于strstr()

9.PHP中 HTTP_HOST 和 SERVER_NAME
相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:
1. 通常情况:
_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。

2. 当服务器为非80端口时:
_SERVER["HTTP_HOST"] 会输出端口号,例如:mimiz.cn:8080
_SERVER["SERVER_NAME"] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:
ServerName mimiz.cn
ServerAlias www.mimiz.cn
客户端访问域名www.mimiz.cn
_SERVER["HTTP_HOST"] 输出 www.mimiz.cn
_SERVER["SERVER_NAME"] 输出 mimiz.cn
所以,在实际程序中,应尽量使用_SERVER["HTTP_HOST"] ,比较保险和可靠。
如果在端口映射的情况下,并且在内网访问,用“$_SERVER['HTTP_X_FORWARDED_HOST']”比较好。

PHP 相关文章推荐
PHP自动生成月历代码
Oct 09 PHP
PHP怎样调用MSSQL的存储过程
Oct 09 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
php eval函数用法总结
Oct 31 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
基于empty函数的判断详解
Jun 17 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
php删除数组元素示例分享
Feb 17 PHP
php+mysqli批量查询多张表数据的方法
Jan 29 PHP
thinkphp中的url跳转用法分析
Jul 12 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
关于PHP堆栈与列队的学习
Jun 21 #PHP
浅析PHP 按位与或 (^ 、&)
Jun 21 #PHP
浅析PHP中Collection 类的设计
Jun 21 #PHP
解析PHP无限级分类方法及代码
Jun 21 #PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 #PHP
解析左右值无限分类的实现算法
Jun 20 #PHP
解析thinkphp的左右值无限分类
Jun 20 #PHP
You might like
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
python实现文件快照加密保护的方法
2015/06/30 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
业绩考核岗位职责
2014/02/01 职场文书
道路建设实施方案
2014/03/18 职场文书
学校工作推荐信范文
2014/07/11 职场文书
党员证明模板
2015/06/19 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis