[讨论] PHP 大批判(尽你所能所知,批判一下子PHP的不足吧)

发表于:2007-05-25来源:作者:点击数: 标签:php一下子尽你所能所知
[color=darkblue:144f007a32][size=18:144f007a32] 俗话说,尺有所长,寸有所短,既要知道自己的长处,也要明白自己的 短处,批评与自我批评是很重要的。 [url=http://w.yi.org/ftp/FAPM][u:144f007a32]PHP[/u:144f007a32][/url]不是万能的,但是没有[url=ht

[color=darkblue:144f007a32][size=18:144f007a32]
      俗话说,尺有所长,寸有所短,既要知道自己的长处,也要明白自己的
  短处,批评与自我批评是很重要的。

    [url=http://w.yi.org/ftp/FAPM][u:144f007a32]PHP[/u:144f007a32][/url]不是万能的,但是没有[url=http://w.yi.org/ftp/FAPM][u:144f007a32]PHP[/u:144f007a32][/url]是万万不行的。

    [b:144f007a32]今天,就尽你所能所知,狠狠的批判一下子[url=http://w.yi.org/ftp/FAPM][u:144f007a32]PHP[/u:144f007a32][/url]吧![/b:144f007a32]

    现在开始,下面请第一位批判者 [i:144f007a32]lucklrj [/i:144f007a32] 发言,大家欢迎[/size:144f007a32][/color:144f007a32]



[color=red:144f007a32][size=18:144f007a32][b:144f007a32]    请特别注意:
    1、拒绝无聊灌水帖
    2、需批判PHP,请勿跑题
[/b:144f007a32][/size:144f007a32][/color:144f007a32]

 lucklrj 回复于:2005-08-30 12:05:33
免费,够用。不担心有天会被追着要钱。

 jhsea3do 回复于:2005-08-30 13:07:42
没法写daemon,没有完善的线程支持,如果你有一个操作需要执行很长时间,最好是把该操作放在线程里执行,而快速的返回一个页面给客户,但我还不清楚PHP应改如何实现。

对象操作符是"->",不是".",为写一些code时增加了麻烦


你不能  (new AClass())->someOperation();
只能  $a = new AClass(); $a->someOperation();

 北京野狼 回复于:2005-08-30 13:22:26
[quote:4bc69c365f="jhsea3do"]没法写daemon,没有完善的线程支持,如果你有一个操作需要执行很长时间,最好是把该操作放在线程里执行,而快速的返回一个页面给客户,但我还不清楚PHP应改如何实现。
[/quote:4bc69c365f]


网站为什么搞这么复杂?
cgi程序有很多缺陷,如果不能简单处理,那还是搞C/S结构吧。


你的要求可以通过system实现,有窍门

 goodloveboys 回复于:2005-08-30 13:28:36
[quote:14debf6c44="北京野狼"]


网站为什么搞这么复杂?
cgi程序有很多缺陷,如果不能简单处理,那还是搞C/S结构吧。


你的要求可以通过system实现,有窍门[/quote:14debf6c44]


我现在在处理一个多层结构的项目,用php,很多地方感觉比较吃力,

其中一个就是和上上个的一样,  

怎么通过system实现??  通过脚本吗??  

有什么窍门,说说?

 北京野狼 回复于:2005-08-30 13:29:15
[quote:76e3cdc1d7="goodloveboys"]


我现在在处理一个多层结构的项目,用php,很多地方感觉比较吃力,

其中一个就是和上上个的一样,  

怎么通过system实现??  通过脚本吗??  

有什么窍门,说说?[/quote:76e3cdc1d7]


有什么好处吗? :D  :D  :D  :D  :D  :)

 goodloveboys 回复于:2005-08-30 14:00:11
汗, 好处是地球人都知道,cu之狼了, 呵呵

 hightman 回复于:2005-08-30 14:23:44
[quote:e6a23f0abb="jhsea3do"]没法写daemon,没有完善的线程支持,如果你有一个操作需要执行很长时间,最好是把该操作放在线程里执行,而快速的返回一个页面给客户,但我还不清楚PHP应改如何实现。

对象操作符是"->",不是".",为写一些cod..........[/quote:e6a23f0abb]

daemon 能写的啊!! posix_fork() , 至于线程,不了解也不好说, 可以用子进程来试试. 
PHP主要是web上的应用,非常复杂的后台程序也不能强求了.

操作符是.还是->也能成为批评的理由啊?

 hightman 回复于:2005-08-30 14:26:35
关于PHP的一些缺点,我转载一篇文章.
[code:1:3358fb4e81]
为什么PHP令人不爽(对于大型系统)
Edwin Martin <edwin@bitstorm.org>.

翻译:ShiningRay @ Nirvana Studio

我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。 

下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。

1. 对递归的不良支持
递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”见bug 1901。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。

2. 许多PHP模块都不是线程安全
在几年前,Apache发布了Web服务器的2.0版。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组不推荐在Apache 2 的多线程模式下运行PHP。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。

请阅读这篇讨论: Slashdot: Sites Rejecting Apache 2?.

3. PHP 因为商业应用而残废
通过使用缓存,PHP的性能可以陡增500%[见基准测试]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的Zend Aclearcase/" target="_blank" >ccelerator,所以当然,他们不想抛弃自己的商业产品这块肥肉。

但是有另一个可选择的: APC. (Zend后来推出Zend Optimizer,免费的加速器——译者)

4. 没有命名空间
设想某个人制作了一个PHP模块用来阅读文件。模块中一个函数叫做read。然后另一个人的模块可以读取网页的,同样包含一个函数read。然后我们就无法同时使用这两个模块了,因为PHP不知道你要用哪个函数。

但是有一个很简单的解决方法,那就是命名空间。曾经有人建议PHP5加入这个特性,但不幸得是他没有这么做。现在,没有命名空间,每个函数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解。

5. 不标准的日期格式字符
很多程序员对 日期格式字符 都很熟悉,它是从UNIX和C语言中来的。其他一些编程语言采用了这个标准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字符。在C中,“%j”表示一年中的当天,在PHP中他表示一个月中的当天。然而使事情更混乱的是:Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数,却使用了C/UNIX的格式化字符。

6. 混乱的许可证
你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。错了!例如,如果你想在PHP中生成PDF文件,你会在手册中发现两个模块:PDF 和 ClibPDF。但是这两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。

7. 不一致的函数命名规则
有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:

直接拼接:getnumberoffiles 
用下划线分开:get_number_of_files 
骆驼法则:getNumberOfFiles 
大部分语言选择其中一中。但是PHP都用到了。

例如,你想要把一些特殊字符转换成HTML实体,你会使用函数htmlentities (直接拼接单词)。如果你要使用相反的功能,你要用到它的小弟弟html_entity_decode。由于某些特殊的原因,这个函数名是由下划线分隔单词。怎么能这样呢?你知道有一个函数叫strpad。或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误。函数是不分大小写的,所以对于PHP来说rawurldecode 和RawUrlDecode之间没有什么区别。这也很糟糕,因为两个都使用到了同时他们看上去还不一样,混淆了阅读者。

8. 魔法引用的地狱
魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击。这很好。但是出于某些原因,你可以在php.ini中关闭这个配置。所以你如果要写出一个有弹性的脚本,你总要检查魔法引用是开启还是关闭。这样一个“特性”应该让编程更简单,而事实上变得更复杂了。

9. 缺少标准框架
一个成长中的网站没有一个整体框架,最终会变成维护的噩梦。一个框架可以让很多工作变得简单。现在最流行的框架模型时MVC-模型,在其中表现层、业务逻辑和数据库访问都分离开了。

很多PHP网站不使用MVC-模型。他们甚至没有一个框架。甚至现在有一些PHP框架同时你都可以自己写一个,关于PHP的文章和手册没有提高框架的一个字。同时JSP-开发人员使用像Struts的框架、ASP开发人员使用.Net,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。

总结
 
什么问题?

对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现我提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?

一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。我希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。

在我写了这篇文章之后,一些人告诉我一些其他的类似文章:

Experiences of Using PHP in Large Websites 
"PHP in contrast to Perl" 
I hate PHP 
PHP Annoyances 


Posted by ShiningRay at 13:38  阅读(353) 评论(4) 引用(0) PHP 
开放权限:所有人可见 

[/code:1:3358fb4e81]

 北京野狼 回复于:2005-08-30 14:40:58
[quote:5d7c978dad="hightman"]

daemon 能写的啊!! posix_fork() , 至于线程,不了解也不好说, 可以用子进程来试试. 
PHP主要是web上的应用,非常复杂的后台程序也不能强求了.

操作符是.还是->也能成为批评的理由啊?[/quote:5d7c978dad]

不要使用fork.

http://bbs.chinaunix.net/forum/viewtopic.php?t=599616&show_type=

 hightman 回复于:2005-08-30 14:42:29
不要使用fork 什么意思? 无法使用,还是你要求不使用fork实现daemon?

 北京野狼 回复于:2005-08-30 14:48:28
cgi程序必须简单处理.
激活某个后台程序,直接system就可以,fork之后的子进程,你知道什么时候 
运行,在父进程之前,之后运行? 子进程死掉,你怎么处理?子进程异常,运行失败怎么控制? 

没必要给自己找麻烦

 ipaddr 回复于:2005-08-30 16:37:56
.net都用WEBForm的概念了。

PHP还是老样,

相对来说,PHP的开发效率不高呀。

 ipaddr 回复于:2005-08-30 16:38:41
PHP不是万能的,

一般用在做WEB开发。

不能拿它和C,之类的比吧。

 hightman 回复于:2005-08-30 18:10:13
[quote:123aff8215="北京野狼"]cgi程序必须简单处理.
激活某个后台程序,直接system就可以,fork之后的子进程,你知道什么时候 
运行,在父进程之前,之后运行? 子进程死掉,你怎么处理?子进程异常,运行失败怎么控制? 

没必要给自己找麻?.........[/quote:123aff8215]

ft... system()是系统调用啊, 只能调用一个已经存在的程序. 

子进程和父进程的关系是平等的啊,谁先执行要看CPU调度.  晕,越说越离谱了,版主要我们讨论的是PHP的缺点.

 sinox 回复于:2005-08-30 18:30:51
尺有所长,寸有所短

这句话是错的

尺本来就长,寸也本来就短

呵呵

应该是

尺有所短,寸有所长

 北京野狼 回复于:2005-08-31 09:12:44
[quote:388e96106e="hightman"]

ft... system()是系统调用啊, 只能调用一个已经存在的程序. 

子进程和父进程的关系是平等的啊,谁先执行要看CPU调度.  晕,越说越离谱了,版主要我们讨论的是PHP的缺点.[/quote:388e96106e]

你干吗不真的去昏。难道不能把子进程写成程序啊。
没有任何理由要使用子进程。

 Yarco 回复于:2005-08-31 13:53:47
非常欣赏和认同hightman的那篇文章.
既然是批判,  当然是要提出不足.
我的感觉还有:
1. 没有Application变量(和asp中比), 至少这点我觉得asp应该加分.
比如我想把一个$sitename加入到网页中来, 那么就会在每个运行页出现一个$sitename.而不是共享的一个.
2. 数据库函数不统一
3. 配置选项烦杂
比如short_open_tag是否开启(早就该关掉了)...
4. 架构混乱
其实感觉和hightman的那篇差不多. 随着php的应用越来越广泛, 加入的东西也在增加. 使得本来纯粹过程化的体系变得凌乱. 没有处理好和数据库,和html的关系以及php在中间所扮演的角色.
...

 oklqh 回复于:2005-08-31 15:19:04
哪个语言没有缺点呢?

java那笨重的身体,没有好服务器还是不要跑的好。

php不是一种伟大的语言,却是一种很适合web轻量级开发的语言。
正如mysql不是一个伟大的数据库,但却是一个很适合中小型应用的数据库。

二者成为了最佳搭档,在我们期待mysql 5.0的时候,是不是也有理由期待梦想中的php 6呢?

 夜猫子 回复于:2005-08-31 18:58:08
我觉得perl有点象加强版的php,目前我觉得php还没有让我达到到不爽的毛病,如果我需要更高一层的需求,我会考虑perl,而不会觉得这是php的错。
ps: 弱类型语言的hash表结构实在是太爽了,这对于以前使用asp的时候完全是不可想象的。

 Yarco 回复于:2005-08-31 20:33:21
楼上的, 我听说perl写大系统别人都看不懂啊.
你这么一讲...当心我跳槽:)

 夜猫子 回复于:2005-08-31 22:31:48
>楼上的, 我听说perl写大系统别人都看不懂啊
这是一种误解,看不懂是写程序的人的错,不是语言的错

 perryhg 回复于:2005-09-01 04:06:14
但是如果和其他语言相比,某些语言更容易让写的人自己都看不懂的话,那么这个语言的设计就有问题了。perl就是因为语言结构松散而遭人诟病,php更甚啊。

 HonestQiao 回复于:2005-09-01 08:55:39
[quote:714d2a477a="perryhg"]但是如果和其他语言相比,某些语言更容易让写的人自己都看不懂的话,那么这个语言的设计就有问题了。perl就是因为语言结构松散而遭人诟病,php更甚啊。[/quote:714d2a477a]

各种语言都有基于自己的一套规则。

如果你是中国人,土生土张的中国人,
如果你看不懂法语,你不能说这个语言存在问题。
如果你看不懂英语,你更不能说这个语言存在问题。
如果你看不懂汉语,也可能你不能说这个语言存在问题,如果你是完全的少数民族呢?

 Yarco 回复于:2005-09-01 09:36:09
猫老大, 我想问一下
1. 就是在web编程上perl和php比有多少优势?
2. perl非得cgi吗?
3. 从语言角度来说perl有哪些比php大的优势?

感觉似乎perl比较低调, 可能更加严谨吧?

 北京野狼 回复于:2005-09-01 10:01:57
[quote:ccc8a8cfda="Yarco"]猫老大, 我想问一下
1. 就是在web编程上perl和php比有多少优势?
2. perl非得cgi吗?
3. 从语言角度来说perl有哪些比php大的优势?

感觉似乎perl比较低调, 可能更加严谨吧?[/quote:ccc8a8cfda]

没优势

 HonestQiao 回复于:2005-09-01 10:03:32
[quote:fc8b7a6d5a="Yarco"]猫老大, 我想问一下
1. 就是在web编程上perl和php比有多少优势?
2. perl非得cgi吗?
3. 从语言角度来说perl有哪些比php大的优势?

感觉似乎perl比较低调, 可能更加严谨吧?[/quote:fc8b7a6d5a]


Perl现在用在Web,有很多可选则的方案的啊,例如:
Mason Perl

 foolkaka 回复于:2005-09-01 11:24:42
[quote:1fd7297414="北京野狼"]

你干吗不真的去昏。难道不能把子进程写成程序啊。
没有任何理由要使用子进程。[/quote:1fd7297414]

没有任何理由要使用子进程?怎么写成程序?
我两个项目都在用。。。用cron检查

 北京野狼 回复于:2005-09-01 11:26:43
[quote:a9d6fa65b9="foolkaka"]

没有任何理由要使用子进程?怎么写成程序?
我两个项目都在用。。。用cron检查[/quote:a9d6fa65b9]

看不懂,说汉语吧

 foolkaka 回复于:2005-09-01 12:02:56
[quote:73879fd0e8="北京野狼"]

看不懂,说汉语吧[/quote:73879fd0e8]

fork实现daemon
cron检查进程

.....
if ($args == '-d' OR $args == '--daemon') {
$pid = pcntl_fork();
$echo = 0;
if ($pid == -1) {
exit;
} else if ($pid) {
return 0; // 返回 '0' 成功
}

// 从控制终端分离...
if (!posix_setsid()) {
exit();
}
else
{
已经后台运行
}
...

// 进程 ID
$fp = fopen("/var/run/ipman.pid","w+");
fwrite($fp,getmypid());
fflush($fp);
fclose($fp);

if (file_exists("/var/run/ipman.pid".'-cron')) {
  $tmp = (int)trim(implode("",file("/var/run/ipman.pid".'-cron')));
$f_pid = pcntl_waitpid ($tmp, $f_stat, WNOHANG);
$f_pid = pcntl_waitpid (0, $f_stat, WNOHANG);
}

$pid = pcntl_fork();

if($pid...

 北京野狼 回复于:2005-09-01 12:55:45
[quote:c2946c0d85="foolkaka"]

fork实现daemon
cron检查进程

.....
if ($args == '-d' OR $args == '--daemon') {
$pid = pcntl_fork();
$echo = 0;
if ($pid == -1) {
exit;
} else if ($pid) {
return 0; // 返回 '0' 成功
}

..........[/quote:c2946c0d85]

大家说的不是一回事情

 geel 回复于:2005-09-01 22:41:06
混乱的函数名,混乱的参数顺序,混乱的if(if 竟然可以接受任意的类型,只要不是false值,给他个数组变量都为true),过于简单的错误处理机制,没有良好的事件支持,没有一个开发商肯为他写一个好一点的IDE

另外,不能因为用叉子切菜不如刀好用就说叉子有问题,不过我还是希望手中的叉子是一把瑞士军刀;)

 z33 回复于:2005-09-01 23:13:37
PHP开发Web太简单了,不容易与新手划开距离。

 HonestQiao 回复于:2005-09-01 23:28:59
[quote:2c0847c8ae="z33"]PHP开发Web太简单了,不容易与新手划开距离。[/quote:2c0847c8ae]


为什么都是用枪的,有人可以百步穿杨呢?
为什么都是买油的,有人可以铜钱孔倒油?

 xgyxgy 回复于:2005-09-02 01:56:02
效率低,没有内建的cache支持.
尤其是在频繁的请求和频繁的数据库连接中,PHP的效率更加低.一年前曾经做过一次关于JSP和PHP在数据库性能方面的测试,放到phpx.com中,还没有一个人能很好地解释原因.
[url]http://www.phpx.com/happy/showthread.php?s=923552bfbb54d3ff31a93e5de8cc4096&threadid=67610[/url]

前几天曾经想用PHP在一个关键应用中,作为一个远程调用的服务,每天调用4000-5000万次.结果压力测试的时候,发觉其性能是JAVA SERVLET的十分之一.JAVA SERVLET一秒可以完成3000个左右的请求,而PHP+APACHE则只能完成不到300,用的是hessian.

不过在非关键应用中,在不是特别频繁调用的时候,PHP还是一个非常爽的语言,开发快,又随心所欲

 perryhg 回复于:2005-09-02 03:13:57
[quote:49d1014a26="HonestQiao"]

各种语言都有基于自己的一套规则。

如果你是中国人,土生土张的中国人,
如果你看不懂法语,你不能说这个语言存在问题。
如果你看不懂英语,你更不能说这个语言存在问题。
如果你看不懂汉语,也可能你不能?..........[/quote:49d1014a26]

Qiao法师有些偏题了吧,而且这个比方也不太合理。这里很多人提出的问题,正是因为在总结了工作中所遇到的种种困难以后对php提出的更高的要求。指出缺点并不是说就没有优点,事实上我个人认为php还是一门非常优秀的语言,至少在web开发里面,作为动态web脚本是非常灵活的,尤其是和asp相比。但是现在问题出在:
1.web应用的发展对web开发提出了更高的要求,比如多线程,对象缓冲等,php本身不是设计在这个level上的,所以解决不了这些更加基础的问题。
2.php把自己应用范围过分扩大实在野心太大,作为一般脚本编程语言,php和perl的重复性太大,OO特性又不及python,尤其是在perl已经普遍成为所有*nix的标准组件的时候,php在这个领域的发展就非常有限了。所有有些高不成,低不就的尴尬。在本坛的讨论者不一定是php语言本身的开发人员,但是至少是php的应用人员,对自己心爱的语言提出批评希望改进,是怎么也不过分的。

 HonestQiao 回复于:2005-09-02 08:21:02
[quote:131e787b48="perryhg"]

Qiao法师有些偏题了吧,而且这个比方也不太合理。这里很多人提出的问题,正是因为在总结了工作中所遇到的种种困难以后对php提出的更高的要求。指出缺点并不是说就没有优点,事实上我个人认为php还是一门非常优秀?.........[/quote:131e787b48]

我所说的,仅仅是针对我的某个上楼,呵呵,没有针对其他的。

等大家批判的差不多了,我们再来讨论,如何采用合理的方法,降低这些不足对我们开发的影响。

 hightman 回复于:2005-09-02 11:19:32
[quote:906ece587b="xgyxgy"]
前几天曾经想用PHP在一个关键应用中,作为一个远程调用的服务,每天调用4000-5000万次.结果压力测试的时候,发觉其性能是JAVA SERVLET的十分之一.JAVA SERVLET一秒可以完成3000个左右的请求,而PHP+APACHE则只能完成不?.........[/quote:906ece587b]

刚看了那个文章,不知你的具体代码是什么.高频连接数据库可以试试 mysql_pconnect() (注意:一定要配置好apache和mysql中的最大连接数的关系,详见手册)

从你的文中我发现的最大问题是,不管什么访问:第一次,第二次,第三次....每次所花的时间都是成倍增长.是不是测试程序有点问题呢?否则你的程序用100次,后面所花的时间不堪设想了.

另外测试web性能,强烈推荐apache自带的工具 ab ,具体看 ab -h

 hightman 回复于:2005-09-02 11:33:36
硬要说瓶颈在于 mysql_connect() , 也不妥的, 只要保证网速正常, 正常的完成 tcp 连接所花的时间在整个程序中基本上可以忽略...你的请求再大再多(到DDOS的频率?)也难以在这一点上降低效率.

后面的数据操作包括数据库查询才是体现效率的地方.

数据库设计中,包括很多论坛都喜欢把整篇文章内容甚至附件上载灌入MYSQL数据库中,这样select出来再通过网络传送到程序这里相当费时间.

这一点上 [url=http://fudforum.org/forum/]fud forum[/url] 的设计就要好得多

 dennis2 回复于:2005-09-02 17:43:02
php 在 web 开发有一定的位置,尤其在简单快速的编程,非常适合。另外,它也很适合海量的 virtual hosting (java 就不太适合)。

我对 php 最大的抱怨是它的安全漏洞实在是太多。看看这一、两年来有多少安全漏洞吧,简直是令人发指。

 rocklv 回复于:2005-09-02 18:40:05
[quote:88a82d2dde="dennis2"]
我对 php 最大的抱怨是它的安全漏洞实在是太多。看看这一、两年来有多少安全漏洞吧..........[/quote:88a82d2dde]

相对于漏洞来说,人才是最大的漏洞,而不是语言。

为什么不批判人先呢?

 dennis2 回复于:2005-09-02 18:49:15
> 为什么不批判人先呢?

你是说批判 php 的开发人员?

 北京野狼 回复于:2005-09-02 20:14:56
其实我对所有的解释型语言都不喜欢,java稍微好点。
只要是我去写程序,超过100行我肯定使用c,c++.无论做客户端还是web.
设置shell都使用 c.
之所以在php版里面混,也就是因为我第一个开发工作是做web的。

 jhsea3do 回复于:2005-09-02 20:37:41
[quote:02515e8f78="北京野狼"]其实我对所有的解释型语言都不喜欢,java稍微好点。
只要是我去写程序,超过100行我肯定使用c,c++.无论做客户端还是web.
设置shell都使用 c.
之所以在php版里面混,也就是因为我第一个开发工作是做web的。[/quote:02515e8f78]

java 不是解释型语言吧...., jython倒是的...

 Yarco 回复于:2005-09-03 12:53:17
[quote:e5169b96a9]超过100行我肯定使用c,c++.无论做客户端还是web.[/quote:e5169b96a9]
cgi啊???
你不会把c/c++做成的web程序也支持skin, template吧...

[quote:e5169b96a9]java 不是解释型语言吧...., jython倒是的...[/quote:e5169b96a9]
何必分得那么细呢?
反正语言到了最后, 语法都是细节.
能快速地做出来, 简洁能用,可扩展就行了...

发这帖子...本质是为了看自己的头像...:) 
无刻意反驳的意思 :)

 powerpolly 回复于:2005-09-03 14:58:05
我以为的缺点:
1、PHP语法太不严谨了,难受的是不区分大小写,这好像不是*nix的风格,过于宽松的后果会降低代码的质量
2、PHP的执行效率实在是太慢了,听说PHP没有线程的概念,是不是跟这有关呢?;
3、命名不一致性,前面有人提到了,PEAR里面定义了一套命名规则,但没多少人去实施;
4、对稍大的字符串的处理吃力,还是少用正则的好,如果不是必要的话;
5、instance a class 居然可以这样:
$className = "myClass";
$obj = new $className();
这里的$className 究竟是什么角色?看上去是一个普通字串,但字串怎么可以作为一个className?在C中有这样定义的吗?
6、PHP4.x中对象支持太薄弱又混乱,不支持封装和多态,不用实例化就可随便调用方法,总的感觉就只是一个func lib集合,怎么能写出高质量的程序?怎么保证代码的可维护性?不过据说这在PHP5中已有改进。PHP5中表现怎样,因为我暂时不太熟这里就不说了;
7、main中声明的变量不能在函数中使用,在C中这是允许的,刚学PHP的时候真不习惯这个;
8、如前面引用的文章中提到的magic quote,每次都得检查一次这个配置,反而变复杂了,有人想到了inherit一个递归函数自动检查$_REQUEST,但递归的效率太低没人愿意用的;
9、缺少内建的对象,这点要表扬ASP;
10、没有自带调试器,Zend的IDE又要$;

我认为PHP的优点:
第一个缺点也是某种优点,那就是上手快,有C的底子一切OK,比C更自由;
众多的函数库;
最大的优点:free:),非常适合中小型应用。开发难度低周期短,凭这一条就成为众多WEB脚本的杀手锏;
有很多免费的库随便用;

 Yarco 回复于:2005-09-03 20:01:06
不是很同意楼上的某几个观点:
1. php在某种程度上是区分大小写的, 只是控制体, 函数, 类名不是(好象php5里区分的). 区分大小写的是变量. 我倒觉得这样做没什么不好.
2. 作为一种脚本语言, 你不能要求太高
4. 估计这个问题在任何语言里都一样
5. php是解释型的. 许多编译型的语言做不到的事情, 它能做到. 那没什么奇怪的. 
6. php本来是过程型的...
9. 是指什么?
11. 估计cli就是用来调试的

 北京野狼 回复于:2005-09-05 09:56:16
[quote:4c8b8cf7fd="Yarco"]
何必分得那么细呢?
反正语言到了最后, 语法都是细节.
能快速地做出来, 简洁能用,可扩展就行了...

发这帖子...本质是为了看自己的头像...:) 
无刻意反驳的意思 :)[/quote:4c8b8cf7fd]

cgi不支持template,那怎么写啊?
我做网站都使用标准c

 csona 回复于:2005-09-05 23:55:40
如果对像操作用"."就好啦

 Yarco 回复于:2005-09-06 08:37:03
[quote:890bb0f33a="csona"]如果对像操作用"."就好啦[/quote:890bb0f33a]
虽然您说的有道理...但老实说,我还是更习惯->
因为这容易让我想到前面的那个是指针, 而不是结构体.

 juggler 回复于:2005-09-06 09:36:09
小的项目开发得很快,而且很易于学习,就是在php.ini里太过于灵活,使得编写程序时要顾及php.ini的参数变化,从而使开发变得麻烦和难于调试。

 geel 回复于:2005-09-06 23:11:37
[quote:49e90f60c9="csona"]如果对像操作用"."就好啦[/quote:49e90f60c9]

这个愿望估计无法达成了

设计时没有好好规划,流行时才想起来发展的东西就是这样
diskfreespace == disk_free_space
is_writeable == is_writable()

这种笑话只有php才有

 hoowa 回复于:2005-09-08 12:53:49
PHP已经离开了当初的目的。现在PHP的函数库,非常混乱。就想存放物品的仓库东西都乱放到里面。

在*nix下PHP要求模块都要静态编译来避免出现memoery leak这样问题。这对为PHP扩展功能很麻烦。

当然这样做速度快。可是最后我只好给Perl写扩展了我可不想把给老板make money的服务器重新编译PHP

PHP的那种FORM既是变量的做法,已经越来越发现有问题了。现在如果是主要PHP的开发公司可能已经要求程序员必须初始化变量了。就象当初嘲笑Perl一样。

PHP的magic quote确实在某些地方起到了作用,可惜对SQL注入防御能力太弱,只能保护mysql。而这个时候你要是使用SQL SERVER那你的噩梦开始了,你又不能关闭magic quote因为旧代码在跑,你又会在MSSQL上出现问题。

PHP在apache下安装确实简单,就是因为这样PHP只能成apache的模块。除非你用别的办法php才能成为apache api

 dualface 回复于:2005-09-09 03:02:37
优点是简单易学、开发小型项目效率高。

至于线程、完全的OO这些要求,我认为对于php这样一种脚本语言来说没必要。难道你想php像python那样慢、java那样吃内存?

而且对于复杂项目,没人规定你只能用php。完全可以将多种平台结合起来,各展所长。

原文转自:http://www.ltesting.net