解析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页面间传递参数实例代码
Jun 05 PHP
PHP 读取文件的正确方法
Apr 29 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
Jan 09 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
php smarty模板引擎的6个小技巧
Apr 24 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
基于php实现的验证码小程序
Dec 13 PHP
PHP写的简单数字验证码实例
May 23 PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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
德生1994机评
2021/03/02 无线电
php 正则匹配函数体
2009/08/25 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
浅谈json_encode用法
2015/03/05 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
详细探究Python中的字典容器
2015/04/14 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python基础教程之Filter使用方法
2017/01/17 Python
python实现数据库跨服务器迁移
2018/04/12 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
面试必备的求职信
2014/05/25 职场文书
小学副班长竞选稿
2015/11/21 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
处理canvas绘制图片模糊问题
2022/05/11 Javascript
SQL Server 中的事务介绍
2022/05/20 SQL Server
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL