BBS水木清华站∶精华区

发信人: midi (迷笛), 信区: Linux        
标  题: Re: PHP3特有的语言特点 
发信站: BBS 水木清华站 (Mon Nov 29 04:12:06 1999) 
 
我曾经在bbs.mit.edu里写文章说明过PHP的问题。有兴趣的朋友可以去看看。 
 
 
这里我要指出的是,这位朋友概念没有弄清楚:什么叫CGI? 
 
CGI是Web服务器调用其它进程的接口。其核心是进程调用。以Linux上 
的Apache来说,Apache调用的CGI,都是另外fork一个CGI进程。该进程 
不是Apache Web Sever的一部分,而是一个独立运行的Application。 
因此CGI程序都是独立的可以自己运行的运用程序,只是它们符合一个接口 
标准,即CGI标准。 
 
PHP是一种HTML嵌入式的脚本语言。其构成的HTML只是一种文档,而不是可以 
独立运行的运用程序。作为Apache的一个模块,PHP的解释器在用户 
请求一个PHP的页面时,实时解释它,并以纯HTML方式输出。PHP解释 
器是Web服务器的模块,而不是独立进程。因此,说PHP是“CGI脚本语言”, 
概念完全错了。 
 
另,PHP是一种没有前途的嵌入式脚本语言。原因是多方面的。 
一,PHP缺乏规模支持。与之类似的嵌入语言,一个是ASP,一个是JSP 
前者可以通过Microsoft Windowsd的COM/DCOM获得ActiveX支持,后者 
可以通过SUN Java的Java Class和EJB获得支持 
二,缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。 
数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开, 
组成二维阵列。ASP可以通过DCOM和微软的Transcation Server来获得 
这种结构支持,JSP可以通过EJB/CORBA以及众多厂商的Application Server来获得 
这种结构支持,但PHP没有这样的条件 
三,PHP及其没有道理地实现了一个混乱的不能统一的数据库接口支持,比如 
对Oracle, MySQL, Sybase的接口,彼此都不一样。这一点让人感觉不可思议, 
而且也使它在电子商务中运用受阻----连PERL都通过DBI而获得一个抽象的 
数据库接口! 
 
美国现在电子商务非常流行。这是指电子商务的支撑环境。微软现在精力 
大概都在W2K和大官司上,因此这方面声音很小。IBM的eBuisness的广告相信 
大家在各种媒体上都见到了。它的核心是采用JSP/Servlet的Web Sphere。西方 
另外一个非常著名的电子商务软件提供商,Intershop。它原来的产品 
Intershop1 2, 3, 4占据了主要的电子商务软件份额。它们都是通过CGI来提供支持 
的。但今年10月后它推出了Enfinity,一个采用JSP/Servlet的电子商务 
Application Server,而且声言不再开发传统软件。Allaire相信搞Web 
开发的人都听说过,因为它是ColdFushion的开发商。Cold Fushion是一个类似 
PHP的东西,但Allaire已经不准备接着开发下去,因为它推出了另外一个 
Application Server: JRun,一个JSP/Servlet的工具。在电子商务领域 
另外一个非常著名的厂商就是Oracle。Oracle8i已经是一个EJB Container,它的 
Application Server采用比较传统的机制,但前两天它推出了它自己的JSP解释器。 
 
今年早些时候,Netscape公开声明不再开发Liveware技术了。Liveware就是 
嵌入式的JavaScript,或者叫Server Side JavaScript.现在它和SUN结成商业 
同盟,用的自然是JSP/Servlet. 
 
国内一些新闻媒体不知道出于什么原因,一直没能赶上美国的这个潮流, 
还在大肆宣传一些注定要过时的东西。当然,我不是说PHP要死,它或许还会 
存在下去,但只会运用于一些小型的非商业性的站点。 
 
如果诸位有心在这方面发展,或者想储备一些技术的话,奉劝花些精力 
到ASP或者JSP上。在Linux上,JSP能有很多很好的支持和实现,比如IBM WebSphere, 
Oracle 8i+JSP,Apache Jserv+GNU JSP, Allaire JRun,以及Apache 
的一个新的计划:Jarkarta.另外,如果想在以后的电子商务支持上站住脚的 
话,还请关注XML——我这两天刚发现国内也有个相关站点:www.xml.org.cn 
 
【 在 yyh (阿欢&正在努力上进中......) 的大作中提到: 】 
 PHP3是一种非常强大的CGI脚本语言,就其语言特点基本上源于C,就其实现 
 方式而言更象PERL,而其对数据库的内在支持更使之成为ASP的强大对手。 
 这里先简要介绍一些PHP3中比较容易弄错的语言特点(与C语言相比较)。 
 1.自动屏蔽的全局变量在函数中的使用 
 不同于C语言,PHP3中的全局变量在函数中是默认不起作用的, 
 比如 
 <? 
 $a = 1; 
 function test() 
 { 
 print $a; // 变量 $a 未定义 
 } 
 test(); 
 print $a; 
 ?> 
 输出的结果不是预想中的“1 1”, 而只有一个“1”。因为 
 全局变量$a在函数里不存在,test函数里的$a无定义,因此不 
 显示,如果要使用全局变量必须用global声明,如 
 <? 
 $a = 1; 
 function test() 
 { 
 global $a; 
 print $a; 
 } 
 test(); 
 print $a; 
 ?> 
 或通过全局变量数组($GLOBALS[])来直接使用,如 
 <? 
 $a = 1; 
 function test() 
 { 
 print $GLOBALS["a"]; 
 } 
 test(); 
 print $a; 
 ?> 
 2.奇妙的变量访问机制 
 PHP3里的变量名允许嵌套定义,如先定义一个$a="hello",然后可以用$$a="world" 
 来访问$hello,最后变成$a="hello", $hello="world"。这里的$操作符有点象C语言 
 里的*,但$是以名字(字符串)链接,而*是以地址链接的。如 
 <? 
 $a = "hello"; // 注意不能有空格 
 $$a = "world"; 
 $$$a = "!"; 
 print $a; // 显示 hello 
 print $hello; // 显示 world 
 print $world; // 显示 ! 
 ?> 
 另外PHP3还提供了用字符串做数组下标建立和访问数组的方法,如前面用到的全局 
 变量数组就是以这种机制访问的,如 
 <? 
 $a["first"] = "second"; 
 $a["second"] = "third"; 
 $a["third"] = "first"; 
 print $a["first"]; // 显示 second 
 print $a[$a["second"]]; // 显示 first 
 print $a[$a[$a["third"]]];// 显示 third 
 ?> 
 3.强大的分块方法 
 在C里面一个语句块可以用 { } 来标出,在 DELPHI 里则是 BEGIN END。而在 PHP3 里 
 更可以用一个":"将一段语句独立成块,这样做的好处不言自明。如 
 <? 
 $date=getdate(time()); 
 if($date["hours"] < 12): 
 ?> 
 <H1>Good morning!</H1> 
 <? 
 elseif($date["hours"] < 18): 
 ?> 
 <H1>Good afternoon!</H1> 
 <? 
 else: 
 ?> 
 <H1>Good evening!</H1> 
 <? 
 endif; 
 ?> 
 while语句也支持类似的分块方法,如 
 $a=5; 
 while($a-- > 0): 
 ?> 
 <H1>print a line</H1> 
 <? 
 endwhile; 
 ?> 
 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.120.189.34] 

BBS水木清华站∶精华区