21st
三月

PHP:捡了西瓜,丢了芝麻。
马克龙 发布于: 2009年03月21日 开发与应用 标签:, , 评论 (0)

非特别说明,转摘请保留以下信息:
本文作者:马克龙(Mark long)
本文链接:http://www.longlinfeng.com/2009/03/21/pick-a-watermelon-sesame-lost/

常言,“捡了芝麻,丢了西瓜”。但在学习开发语言的时候,我们往往容易“捡了西瓜,丢了芝麻”。在学习某一种语言的时候中,我们往往总是想着自己什么时候、怎么样开发出一些高级应用,总是盯着那些热门的框架的架构如何优秀、如何优雅……很容易忽略了语言的基础,或者说是细枝末节的东西。虽然说很多种语言的基础知识都是大同小异,无非是一些数据类型、常用函数、控制语句等等,但正是那小部分的“异”细节上的“异”构成了这门语言的特色之一。

记得上次遍历PHPChina论坛的时候,看到有个同行去yahoo面试,其中被问了一个看似很初级的问题:require和require_once有啥区别?呵呵,那位老兄似乎有点被卡了…奇虎CHO接受PHPChina访谈时,建议PHPer不要拘泥于这种语言,而要重视一些基础的学习与积累,重要的是开发的理念与方法。事实也是如此,我们所构建的程序是否具备健壮性、可扩展性、可维护性、优雅性,是同时取决于对语言基础和开发理念的熟练应用。所以,这让我重新检视自己,让自己能“眼高手低”地去捡“芝麻”。

呵呵,扯远了。这里记录几点,是我在温习《PHP与MySQL程序设计》等资料时发现的模糊或陌生的地方。

1、require()与include()区别
①、 无论require()的位置如何,指定文件都将在运行时被加载到出现require()的脚本中。看下例,即使将require(‘a.php’)放在表达式为false的if语句中,test.php依然会加载a.php。如果使用include(‘a.php’)时,test.php并不加载仍将正常执行。两种情况,test.php的执行性能显然有些差异。

/*—–test.php—–*/
if (true) {
    //假定不存在b.php
    require('b.php'); //include('b.php');
} else {
    //假定存在a.php
    require('a.php'); //include('a.php');
}
 
echo 'The end'; // print "The end" or not

②、当require()出错(不是语法错误)时,脚本将停止执行,而在使用include()的情况下,脚本将继续执行。看上例(b.php文件不存在),require(‘b.php’)语句使脚本停止执行,所以不输出“The end”;而使用include(‘b.php’)时,只是产生警告,仍继续执行输出 “The end”;

2、sprintf() 与 printf()的区别
与printf()直接指派到标准输出不同,sprintf()是将输出指派到字符串。这跟_e()、__()两者间的比较如出一辙。

$cost = sprintf('$%01.2f', 43.2); // $cost = '$43.20';
echo gettype($cost); // string

3、关于校验Email老生常谈了。关于使用js或php两种语言进行正则验证的文章泛滥成灾,一般人的做法也只是b/s两端进行格式上的校验。不过很多人还是忽视了对“邮箱的域名是否真实存在”的验证,以及对“邮箱是否真实存在”的验证。这种严谨性在使用Email诸如注册网站帐号时,尤其重要。严谨的流程应该是:
①客户端js的正则验证->②使用PHP对Email格式的正则校验->③域名有效性校验->④Email有效性校验

网络上也有关于第④步骤的实现(link),但其可行性和准确性有待证实。至于第③步则可以使用checkdnsrr()函数(但Windows平台下的PHP没有实现该函数的)。

4、关于变量作用域
关于PHP中的变量作用域,我只想提一点与C、Java的不同。在C、Java的控制语句中定义的变量的作用域只限定在该控制结构中,即局部变量。而在PHP中则不同,请看三者的对比。

/*--test.php--*/
 
for ($i=0; $i<5; $i++) echo $i;
echo "\n".$i;//输出 5
/*--test.c--*/
#include <stdio.h>
 
int main() {
    for (int i=0; i<10; i++)
        printf("%d\t", i);//输出0 1 2 3 4
    printf("\n%d", i); //将出现i未被声明的错误
}
/*—-Test.java—-*/
 
public class Test {
    public static void main(String[] args) {
        for (int i=0; i<5; i++)
            System.out.print(i);
        System.out.println(i);//将出现编译错误,未定义变量i
    }
}

关于变量作用域,FleaPHP作者廖宇雷利用“符号变量表”对PHP的变量作用域做了详细、形象的阐述

你可能也会喜欢以下文章

留下评论