Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193979
  • 博文数量: 54
  • 博客积分: 1542
  • 博客等级: 上尉
  • 技术积分: 537
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 11:51
文章分类

全部博文(54)

文章存档

2017年(1)

2008年(2)

2007年(20)

2006年(31)

我的朋友

分类:

2006-05-24 23:49:55

* 参数和返回值极其矛盾
  * PHP对大小写不敏感的操作使用不同的函数
  * PHP的函数命名方式的不一致
  * PHP没有词法范围
  * PHP的主名空间中函数太多
  * PHP缺少抽象令 TIMTOWTDI 走向糟糕的极端
  * 更多信息

参数和返回值极其矛盾

要展示这个问题,下面有一个函数列表,里面的函数用来匹配用户定义的内容:(也许甚至那些用PHP的人才会使用这个文档,只是用来查看该用哪个函数:P)
      匹配      替换使用      大小写不敏感      返回的数字      数组参数      返回匹配      s/m/x标志      偏移(-1=结尾)
ereg      ereg            否      所有      否      数组      无      0
ereg_replace      ereg      字符串      否      所有      否      无      无      0
eregi      ereg            否      所有      否      数组      无      0
eregi_replace      ereg      字符串      否      所有      否      无      无      0
mb_ereg      ereg[1]            否      所有      否      数组      无      0
mb_ereg_replace      ereg[1]      字符串/表达式      否      所有      否      无      有      0
mb_eregi      ereg[1]            否      所有      否      数组      无      0
mb_eregi_replace      ereg[1]      字符串      否      所有      否      无      无      0
preg_match      preg[2]            皆可      一个      否      数组      有      0
preg_match_all      preg            皆可      所有      否      数组      有      0
preg_replace      preg      字符串/表达式      皆可      无/所有      是      无      有      0
str_replace      str      字符串      否      所有      是      数字      无      0
str_ireplace      str      字符串      是      所有      是      数字      无      0
strstr, strchr      str            否      一个      否      子串      无      0
stristr      str            是      一个      否      子串      无      0
strrchr      str            否      一个      否      子串      无      -1
strpos      str            否      一个      否      索引      无      n
stripos      str            是      一个      否      索引      无      n
strrpos      char[3]            否      一个      否      索引      无      n
strripos      str            是      一个      否      索引      无      -1
mb_strpos      str[1]            否      一个      否      索引      无      n
mb_strrpos      str[1]            否      一个      否      索引      无      -1

这种问题还存在在其他的函数组里,不仅仅是匹配的这部分而已。

(在Perl中,所有这些功能都可以通过四个简单的操作符来完成。)

[1] 用于处理多字节字符
[2] PCRE regex: 所谓的“Perl兼容”的正则表达式。
[3] 在PHP5中也是字符串str
PHP对大小写不敏感的操作使用不同的函数

(这个可能会有两方面的争论。有些人认为提供不同的函数更好,即使这意味着又要记很多名词了)

在Perl中,你可以使用两个lc() 或者是 /i 标志,而PHP通常会提供一个大小写敏感的变量。而且,大小写不敏感的那些版本的函数名的命名方式也不一致。
Perl:      $foo cmp $bar      lc $foo cmp lc $bar
PHP:      strcmp($foo, $bar)      strcasecmp($foo, $bar)
            
Perl:      index($foo, $bar)      index(lc $foo, lc $bar)
PHP:      strpos($foo, $bar)      stripos($foo, $bar)
            
Perl:      $foo =~ s/foo/bar/      $foo =~ s/foo/bar/i
PHP:      $foo = str_replace('foo', 'bar', $foo)      $foo = str_ireplace(...)
PHP:      $foo = ereg_replace('foo', 'bar' ,$foo)      $foo = eregi_replace(...)
PHP的函数命名方式的不一致

  * 大小写不敏感的函数有一个'i'或者'case'在函数名的不同的位置。
  * 毫无表现上的规律 有下划线的 和 没下划线的:

下划线          无下划线:

stream_get_line     readline
disk_free_space     diskfreespace
is_object        isset
mcal_day_of_week     jddayofweek
set_error_handler    setlocale
snmp_get_quick_print   snmpget
get_browser       getallheaders
base64_encode      urlencode
image_type_to_mime_type imagetypes
msql_num_fields     mysql_numfields
php_uname        phpversion
strip_tags        stripslashes
bind_textdomain_codeset bindtextdomain
cal_to_jd        gregoriantojd
str_rot13        strpos

   Perl的核心函数名则没有含有下划线的。
  * PHP 有 unlink 、link 和 rename 和系统调用一致,但是 touch 的系统调用是 utime, 不是 touch。
  * 同时你也无法确定单词的顺序:
     o 宾语 动词:base64_decode, iptcparse, str_shuffle, var_dump
     o 动词 宾语:create_function, recode_string

   Perl的核心函数都是“动词 宾语”结构的除了替代的 dbm* 函数。(注意里面的 sys 是一个前缀,而不是一个宾语。同时 flock 和 lstat 是根据系统调用命名的。shm* 和 msg* 是库函数调用)
  * "to" 还是 "2"?

   ascii2ebcdic, bin2hex, deg2rad, ip2long, cal_to_jd (jdto*, *tojd), strtolower, strtotime,

PHP没有词法范围

Perl 有词法范围和动态范围。PHP则没有。

对于为什么词法范围很重要的解释,可以参考 Coping with Scoping.
      PHP      Perl
超全局(Superglobal)      有      有[1]
全局(global)      有      有
函数局部      有      有
词法域(块局部)      无      有
动态域      无      有

[1] Perl有一些变量总是在main:: 命名空间中。这些类似于PHP的超全局变量。
[2] 在子过程的块中使用一个词法变量,就可以作为一个函数的局部变量。
PHP的主名空间中函数太多

(使用编译了所有核心分发包中的可用扩展的核心库,我们使用了2003年11月发布的版本)

PHP 主要函数的数量:3079 [1]
Perl主要函数的数量:206 [2]

中值PHP 函数名长度:13
平均PHP 函数名长度:13.67
中值Perl函数名长度:6
平均Perl函数名长度:6.22

注意,Perl的一些函数有简短的等价语法:

readpipe('ls -l') ==> `ls -l`
glob('*.txt')   ==> <*.txt>
readline($fh)   ==> <$fh>
quotemeta($foo)  ==> "\Q$foo"
lcfirst($foo)   ==> "\l$foo" (lc is \L)
ucfirst($foo)   ==> "\u$foo" (uc is \U)

[1] 来源:PHP Quick Reference
[2] 来源:perldoc perlfunc
PHP缺少抽象令 TIMTOWTDI* 走向糟糕的极端

*(There Is More Than One Way To Do It,有不止一种方式来完成它)

为什么PHP有3079个函数但是Perl却只有206个?在PHP中,常常有好几个十分相似的函数。在Perl中,你要了解和记住的要少很多。

另外一个重要的因素是模块的使用,尤其是DBI模块——它用来提供数据库支持,而不是把很多特性塞进内核,占用了空间却很少用到。

(不常用的模块不计算在内(所以这里排除了PHP的PEAR和Perl的IO::File)). 如果核心没有提供类似的功能,那么这些模块也会算在里面。为了简便起见,内部的工作方式将会忽略。)

  *

转义:

     o

PHP: (14)
  dbx_escape_string, escapeshellarg, escapeshellcmd, pg_escape_bytea,
  pg_escape_string, pg_unescape_bytea, addslashes, addcslashes, preg_quote,
  quotemeta, mysql_escape_string, mysql_real_escape_string,
  mysqli_real_escape_string, sqlite_escape_string

     o

Perl: (2) [1]
  quotemeta, $dbh->quote

  *

排序:

     o

PHP: (16)
  sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort,
  array_multisort, uasort, uksort, dbx_sort, imap_sort, ldap_sort, yaz_sort

     o

Perl: (1)
  sort

  *

遍历列表:

     o

PHP: (10)
array_filter, preg_grep, array_search, array_unique, in_array, array_map,
array_walk, array_count_values, array_change_key_case, array_sum

     o

Perl: (2)
map, grep

  *

分割:

     o

PHP: (8)
split, explode, strtok, spliti, chunk_split, mb_split, preg_split,
str_split

     o

Perl: (1)
split

  *

匹配:

     o

字符串:

        +

PHP: (11)
strstr, strchr, stristr, strpos, strrchr, stripos, mb_strpos,
mb_strrpos, strrpos, strripos, substr

        +

Perl: (3)
index, rindex, substr

     o

正则表达式:

        +

PHP: (6)
ereg, eregi, mb_ereg, mb_eregi, preg_match, preg_match_all

        +

Perl: (1)
m//

  *

替换匹配部分:

  * PHP: (12)
  ereg_replace, eregi_replace, mb_ereg_replace, mb_eregi_replace,
  preg_replace, str_ireplace, str_replace, ltrim, rtrim, trim, nl2br

  * Perl: (1)
  s///

  *

连接到数据库:

     o

PHP: (17 或更多)
  dbx_connect, fbsql_connect, ibase_connect, msql_connect, msql_pconnect,
  mssql_connect, mysql_connect, odbc_connect, pg_connect, pg_pconnect,
  sesam_connect, ifx_pconnect, ifx_connect, sqlite_open, sqlite_popen,
  mysqli_connect, mysqli_pconnect

     o

Perl: (2)
  DBI->connect, DBI->connect_cached

  *

打开(文件、进程等):

     o

PHP: (5)
  dio_open, fopen, proc_open, popen, gzopen[2]

     o

Perl: (2)
  open, sysopen

  *

读取/接收:

     o

PHP: (12)
  dio_read, fread, gzread[2], socket_read, socket_recv, socket_recvfrom,
  socket_recvmsg, readline, fgetc, fgets, stream_get_line, file

     o

Perl: (5)
  read, readline, sysread, recv, getc

  *

打印/输出/写入:

     o

PHP: (14)
print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,
gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,
socket_writev

     o

Perl: (5)
print, printf, syswrite, send, write

  *

关闭:

     o

PHP: (7)
closelog, dio_close, fclose, gzclose[2], pclose, socket_close,
proc_close

     o

Perl: (1)
close

  *

常用/工具:

     o

PHP:
array_combine, array_fill, array_flip, array_merge, list, range, count,
create_function, strtr, pow, putenv, getenv, getmygid, getmypid, getmyuid

     o

Perl:
使用语法或者魔术变量

[1] 因为系统的LIST语法和DBI的占位符,显式转义常常是不需要的。
[2] 在Perl中是由PerlIO层来处理的。
更多信息

  * Re^2: Is Perl a good career move? by Juerd, 2005
     o 依然没有命名空间
     o 没有闭包,甚至没有匿名函数
     o 没有良好的HTML分析器
     o 没有简单的MIME构建工具
     o 没有良好的WWW库
     o 没有 CPAN
     o 没有数组
     o 没什么用的逻辑操作符
  * Yaywoo! by Dave Brown, 2004
     o 使用system()无法避免(不安全的)shell
     o XY-problem
     o 大量的不同程序,但是,很多只是做了差不多的事情的变体
     o 第二参数和返回值毫无意义
     o 函数名的差劲拼写方式
  * Why PHP sucks by Edwin Martin, 2004 ,中文翻译 为什么PHP令人不爽(对于大型系统) By ShiningRay
     o 不良的递归支持
     o PHP 不是线程安全的
     o PHP 由于商业原因而不健全
     o 没有命名空间
     o 非标准的日期格式化字符
     o 混乱的许可证
     o 不一致的函数命名规则
     o 魔法引用地狱
  * Perl vs. PHP - octo's subjektiver Vergleich by Florian Forster, 2003 (German)
     o Perl 比 PHP 快很多
     o Perl 比 PHP 更丰富
     o Perl 比 PHP 有更好的文档
     o PHP 缺乏模块化支持
     o PHP的here-docs对Windows用户毫无用途
     o PHP 缺少一致的数据库API
     o PHP 缓存数据库查询结果很危险
     o 图形上,PHP实际上被限制在了 GD 中
  * I hate PHP by Keith Devens, 2003
     o 白痴似的——调用时不推荐引用传递
  * Experiences of Using PHP in Large Websites by Aaron Crane, 2002
     o PHP 是推荐把表现和业务逻辑结合起来的
     o 没有命名空间造成很多问题
     o php.ini 的全局配置
     o 过分简单化导致了额外的复杂度
  * PHP Annoyances by Neil de Carteret, 2002
     o 没有真正的引用或者指针
     o 毫无命名空间的概念
     o 毫不组件化
     o 想变成Perl,但事实上也没想变成Perl
     o 没有标准的DB接口
     o 所有的PHP社区都是针对非程序员的
     o 不支持链式方法调用 (现在已经不是了 --tnx.nl)
     o 没有全局变量除非通过导入
     o register_globals 和 $_REQUEST 都让人痛心
     o 数组都是哈西表
     o PEAR 并不是 CPAN
     o Arrays 不能内插值替换成字符串(如$a=array();$b="$a";是错误的)
     o 没有类似 "use strict" 用来检验变量名的功能
  * PHP: A love and hate relationship by Ivan Ristic, 2002
     o 社区令我不安
     o 知识渊博的人少之又少
     o Zend 发布的文章还建议不安全的实践方式
  * My list of PHP shortcomings by Nathan Torkington, 2001
     o 没有命名空间
     o 所有的函数都是全局的
     o 没有真正的引用
     o 没有真实的数据结构 (现在已经不是了 --tnx.nl)
     o 没有匿名函数

引用

EFnet #php: 19:45 <+Dragnslcr> Comparing PHP to Perl is like comparing pears to newspapers

Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz
阅读(802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~