Mar 12, 2010
在php内部字符串可以使用单引号引起来,也可以使用双引号引起来。(当
然还有第三种方式在此不做说明了)
它们的作用和效率是不同的,对于双引号的字符串,其内部的变量会被
变量对应的值代替,但单引号就不同了。
例:
$var = ‘hello’;
$greeting = “$var world”;
echo $greeting;
那么会得到hello world
如果$greeting的值改成:’$var world’,那么执行结果会变成如下了:
$var world
由此我们可以看出,有时候我们必须使用双引号,才能达到我们的一个
预期目的。
但是,从效率上讲,双引号的字符串是会带来额外的消耗的,其原因我
想就不用解释了吧。
下面再给大家讲一个小的诡异的点吧。
printf(’hello %s\n’, ‘world’);
printf(”hello %s\n”, ‘world’);
printf(’hello %s\n’, “world”);
printf(”hello %s\n”, “world”);
有什么不同,读者自已思考一下吧:)
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!
Mar 12, 2010
为了说明问题,我们看如下三个php文件:
//file: functions.php
require_once(’my_once.php’);
require_once(’my_once.php’);
function test()
{
require_once(’my_unonce.php’);
//require(’my_unonce.php’);
}
test();
test();
//file:my_once.php
printf(”%s\n”, ‘my_once’);
//file: my_unonce.php
printf(”%s\n”, ‘my_unonce’);
好,现在我们做一下测试:
php functions.php
输出结果如下:
my_once
my_unonce
这与我们期望的结果是不一致的,因为我们期望调用两次test函数,
即让test做两遍事情,但事实上只做了一次。
我们对functions.php改一下,require_once改成require(函数内部)
//file: functions.php
require_once(’my_once.php’);
require_once(’my_once.php’);
function test()
{
//require_once(’my_unonce.php’);
require(’my_unonce.php’);
}
test();
test();
再试一下,输出结果如下:
my_once
my_unonce
my_unonce
正是我们期望的结果。
时常听人说,即然有了require_once就不要再使require了,实不正
确的,各有各的用处点吧。
另外需要说明的是,实际效率也是不同的,require要比require_once快
好多。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!
Mar 11, 2010
一次偶然的机会,发现发一段程序感觉诡异,于是详细查了一把文档。
原程序如下:
class os_cart {
public function pay() {
//do something
}
….
}
os_cart::pay();
即然成员函数声明的不是static的,为什么可以使用静态模式来调用呢?这样
为什么不会报错呢?查了一下文档,原来和error_reporting函数相关。如果
error_reporting的设置包含了E_STRICT的话,那么程序会进行严格的检查,
对于非静态函数进行静态方式调用,就会报错。如果将E_STRICT错误过滤掉
的话,就不会报错了。
error_reporting的设置方式:
1 在php.ini配置文件中进行配置,相关值如下列表:
value
constant
1
E_ERROR
2
E_WARNING
4
E_PARSE
8
E_NOTICE
16
E_CORE_ERROR
32
E_CORE_WARNING
64
E_COMPILE_ERROR
128
E_COMPILE_WARNING
256
E_USER_ERROR
512
E_USER_WARNING
1024
E_USER_NOTICE
2047
E_ALL
2048
E_STRICT
2 在程序中进行设置,在程序入口处使用error_reporting函数进行设置
如 error_reporting(E_ALL | E_STRICT);这里需要说明的是,E_ALL并
不包含E_STRICT。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!
Feb 24, 2010
我们今天要向大家介绍的是PHP magic_quotes_gpc的具体使用方法。大家都知道在PHP中一个特殊的函数魔术函数,它在引用的过程中只有在传递$_GET,$_POST,$_COOKIE时才会发生作用。
1.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
2.
条件: PHP magic_quotes_gpc=off
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据存入数据库,数据库保存的是snow”’’sun 而并不是我们想象的snow\’\’\’\’sun
3.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow”’’sun (和输入一样)
输出数据格式:snow”’’sun (和输入一样)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
但\’并未作为数据入数据库,数据库保存的是snow”’’sun而并不是我们想象的snow\’\’\’\’sun。
4.
条件: PHP magic_quotes_gpc=on
写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow”’’sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow\’\’\’\’sun (添加了转义字符)
输出数据格式:snow\’\’\’\’sun (添加了转义字符)
说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\’,后者的转换被作为数据写入
数据库,数据库保存的是snow\’\’\’\’sun
总结如下:
1. 对于PHP magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于PHP magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
PHP magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime [...]
Jan 26, 2010
不知觉间,php使了两年多了,中间踩过不知多少坑,当然,也从中体悟到
很多东西,也做了不少东西,多多少少有些感想,慢慢总结下来吧。
1 php语方层面很随意:
这也主要是由它的功能及所属的层面决定的吧。php弱类型,在变量比较的
时候可以选择使用==或===,前者表示变量转换成同类型后的值是不是相等,
而后者则是要求首先是类型相同,然后值也相同。
php变量可以动态定议,它不需要提前定意一个变量,也不必要定义的时候
指定该变量的类型。比如var $variable;则一个$variable变量便产生了,
它的类型实际是由赋于它的值决定的。因此这一方面,使用都可以少了许多
束缚。
2 php有很好的正则支持:
php提供了较为丰富的正则支持,如preg_match, preg_match_all等。
如果想从一个字符串或文件中提取出来一些片段,那是十分方便的。比如
有如下文本:
192.168.1.1 xxx user:zja601 url:http://blog.niukey.com
如果我们想提取出user和url的话,如简单语句就可搞定:
if (preg_math(’/^.*user:([^\s]*)\surl:(.*)$/’, $string, $arr_result)) {
printf(”user is:%s url is:%s”, $arr_result[1], $arr_result[2]);
}
简单吧,当然,shell脚本可能会有更简单的办法,比如:sed -n ’s/^.*user:\([\s]*\)\burl:\(.*\)$/\1 \2/p’
但php可以结合其它的一些场合,而不像shell那么孤立的功能,使得整体功能更加
灵活。
3 php有强大的函数库:
比如数组$_GET参数到字符串形式的来回转换,有explode和build_string_query就很轻
松的搞定了。比如数组的array_merge,push, pop等等,可能帮助你事半功位。比如php数
组的强大功能,给你在c/c++花很大力气才能达到的效果。比如操作pdf,文件等函数,在
需要的时候文档一下即可搞定。
4 php对面向对象的思想支持的也相对不错:
从php4之后,php对面象对象支持的越来越好。特别是interface的抽象,可能使设计的
时候更加关注接口间的合理性考量。php的继承关系也达到了一个很好的复用效果,如果你
是一位C++爱好者,那么也试一下php的C++版本吧,一定会有不错的效果。php的对象的
执行也是动态的,就是在c++或java里讲的后期绑定吧。
5 php语言的动态性:
php语言具有动态性,它在动态执行的时候,解析代码。源代码写好即可执行,不必要
经历一个繁琐的编译过程。动态性也表现为程序运行时解析,因此它只解析运行到的代码
而不去解析未执行的代码。(尽管有人说这一点并不太好)动态性的另外一个层面就是上
面讲的对象的动态性了。
其实php也有其内在的陷阱
比如函数参数的引用传递,比如函数返回值的引用返
回,这些都有可能造成php的fatal的出现。另外,正是由于php的弱类型,往往有
时候,我们不能很精确的把握程序进行时的值或状态。如果真的想得到当时的值或
状态,可能花费的力气并不值得(并不是做不到)。php的@符号用来抑制一些错误
的报出,有时候不做一些额外的判断,就有可能有意想不到的问题产生。php函数名
的长度会影响其执行的效率,这可能许多程序员不会注意到(当然很多场合不必要去
注意这些事),尽管我们选择php语言,不是选择它的效率。php动态执行,因此一
些有基本语法错误的地方,如果程序运行时走不到,那么有可能就不会被发现。诸如
此类的还有很多。。。
多谢
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!