[讨论] PHP 大批判(尽你所能所知,批判一下子PHP的不足吧)
时间:2007-02-17 来源:PHP爱好者
俗话说,尺有所长,寸有所短,既要知道自己的长处,也要明白自己的
短处,批评与自我批评是很重要的。
[u:144f007a32]PHP[/u:144f007a32]不是万能的,但是没有[u:144f007a32]PHP[/u:144f007a32]是万万不行的。
[b:144f007a32]今天,就尽你所能所知,狠狠的批判一下子[u:144f007a32]PHP[/u:144f007a32]吧![/b:144f007a32]
现在开始,下面请第一位批判者 [i:144f007a32]lucklrj [/i:144f007a32] 发言,大家欢迎[/size:144f007a32][/color: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 <[email protected]>.
翻译: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 Accelerator,所以当然,他们不想抛弃自己的商业产品这块肥肉。
但是有另一个可选择的: 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中,还没有一个人能很好地解释原因.
php爱好者站 http://www.phpfans.net 为phper提供一切资讯.
相关阅读 更多 +