PHP vs PERL
2010-03-12 11:09:07 阿炯
翻译:ShiningRay@Nirvana Studio
目录
* 参数和返回值极其矛盾
* PHP对大小写不敏感的操作使用不同的函数
* PHP的函数命名方式的不一致
* PHP没有词法范围
* PHP的主名空间中函数太多
* PHP缺少抽象令 TIMTOWTDI 走向糟糕的极端
* 更多信息
参数和返回值极其矛盾
要展示这个问题,下面有一个函数列表,里面的函数用来匹配用户定义的内容:(也许甚至那些用PHP的人才会使用这个文档,只是用来查看该用哪个函数)
匹配 替换使用 大小写不敏感 返回的数字 数组参数 返回匹配 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") ==>
readline($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)). 如果核心没有提供类似的功能,那么这些模块也会算在里面。为了简便起见,内部的工作方式将会忽略)
*转义:
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
Perl: (2)
quotemeta, $dbh->quote
*排序:
PHP: (16)
sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort,array_multisort, uasort, uksort, dbx_sort, imap_sort, ldap_sort, yaz_sort
Perl: (1)
sort
*遍历列表:
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
Perl:(2)
map, grep
*分割:
PHP:(8)
split, explode, strtok, spliti, chunk_split, mb_split, preg_split,str_split
Perl:(1)
split
*匹配:
字符串:
+PHP: (11)
strstr, strchr, stristr, strpos, strrchr, stripos, mb_strpos,mb_strrpos, strrpos, strripos, substr
+Perl: (3)
index, rindex, substr
正则表达式:
+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///
*连接到数据库:
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
Perl: (2)
DBI->connect, DBI->connect_cached
*打开(文件、进程等):
PHP: (5)
dio_open, fopen, proc_open, popen, gzopen[2]
Perl: (2)
open, sysopen
*读取/接收:
PHP: (12)
dio_read, fread, gzread[2], socket_read, socket_recv, socket_recvfrom,socket_recvmsg, readline, fgetc, fgets, stream_get_line, file
Perl: (5)
read, readline, sysread, recv, getc
*打印/输出/写入:
PHP: (14)
print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,socket_writev
Perl: (5)
print, printf, syswrite, send, write
*关闭:
PHP: (7)
closelog, dio_close, fclose, gzclose[2], pclose, socket_close,proc_close
Perl: (1)
close
*常用/工具:
PHP:
array_combine, array_fill, array_flip, array_merge, list, range, count,create_function, strtr, pow, putenv, getenv, getmygid, getmypid, getmyuid
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 Comparing PHP to Perl is like comparing pears to newspapers
Perl Monks: PHP - it"s "training wheels without the bike" -- Randal L. Schwartz
Perl是较早的动态编程语言。在Perl里面,原来变量是可以不用声明类型的;变量的类型还是可以变的;原来一个@符号有时候是一个数组,有时候还可以是一个数组的长度;原来Perl里面还可以镶嵌另外一种语言-正则表达式,在那本1000页里面这个内容就讲了200页。原来大家写的程序都可以汇集在一起,集中在一个叫CPAN的地方供大家调用。
让人感觉来到了外太空。但Perl真的是有点难了,事后看不懂!当遇到PHP的时候,就像看见了那个简化版本的“Perl”,当看见Python的时候,看见了那个更简化但有点规矩(缩进)的“Perl”。
PHP和Python,觉得另外一个作用是可以引导你进入Linux的世界。因为他们的生存环境就在Linux,甚至直接复制了Linux的指令作为函数名称!所以PHP是一门很简单实用的语言;如果喜欢Python,它也是好的一个选择,AI兴起肋力了Python。
目录
* 参数和返回值极其矛盾
* PHP对大小写不敏感的操作使用不同的函数
* PHP的函数命名方式的不一致
* PHP没有词法范围
* PHP的主名空间中函数太多
* PHP缺少抽象令 TIMTOWTDI 走向糟糕的极端
* 更多信息
参数和返回值极其矛盾
要展示这个问题,下面有一个函数列表,里面的函数用来匹配用户定义的内容:(也许甚至那些用PHP的人才会使用这个文档,只是用来查看该用哪个函数)
匹配 替换使用 大小写不敏感 返回的数字 数组参数 返回匹配 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") ==>
readline($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)). 如果核心没有提供类似的功能,那么这些模块也会算在里面。为了简便起见,内部的工作方式将会忽略)
*转义:
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
Perl: (2)
quotemeta, $dbh->quote
*排序:
PHP: (16)
sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort,array_multisort, uasort, uksort, dbx_sort, imap_sort, ldap_sort, yaz_sort
Perl: (1)
sort
*遍历列表:
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
Perl:(2)
map, grep
*分割:
PHP:(8)
split, explode, strtok, spliti, chunk_split, mb_split, preg_split,str_split
Perl:(1)
split
*匹配:
字符串:
+PHP: (11)
strstr, strchr, stristr, strpos, strrchr, stripos, mb_strpos,mb_strrpos, strrpos, strripos, substr
+Perl: (3)
index, rindex, substr
正则表达式:
+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///
*连接到数据库:
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
Perl: (2)
DBI->connect, DBI->connect_cached
*打开(文件、进程等):
PHP: (5)
dio_open, fopen, proc_open, popen, gzopen[2]
Perl: (2)
open, sysopen
*读取/接收:
PHP: (12)
dio_read, fread, gzread[2], socket_read, socket_recv, socket_recvfrom,socket_recvmsg, readline, fgetc, fgets, stream_get_line, file
Perl: (5)
read, readline, sysread, recv, getc
*打印/输出/写入:
PHP: (14)
print, echo, printf, fprintf, vprintf, dio_write, fwrite, fputs,gzwrite[2], socket_send, socket_sendmsg, socket_sendto, socket_write,socket_writev
Perl: (5)
print, printf, syswrite, send, write
*关闭:
PHP: (7)
closelog, dio_close, fclose, gzclose[2], pclose, socket_close,proc_close
Perl: (1)
close
*常用/工具:
PHP:
array_combine, array_fill, array_flip, array_merge, list, range, count,create_function, strtr, pow, putenv, getenv, getmygid, getmypid, getmyuid
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 Comparing PHP to Perl is like comparing pears to newspapers
Perl Monks: PHP - it"s "training wheels without the bike" -- Randal L. Schwartz
Perl是较早的动态编程语言。在Perl里面,原来变量是可以不用声明类型的;变量的类型还是可以变的;原来一个@符号有时候是一个数组,有时候还可以是一个数组的长度;原来Perl里面还可以镶嵌另外一种语言-正则表达式,在那本1000页里面这个内容就讲了200页。原来大家写的程序都可以汇集在一起,集中在一个叫CPAN的地方供大家调用。
让人感觉来到了外太空。但Perl真的是有点难了,事后看不懂!当遇到PHP的时候,就像看见了那个简化版本的“Perl”,当看见Python的时候,看见了那个更简化但有点规矩(缩进)的“Perl”。
PHP和Python,觉得另外一个作用是可以引导你进入Linux的世界。因为他们的生存环境就在Linux,甚至直接复制了Linux的指令作为函数名称!所以PHP是一门很简单实用的语言;如果喜欢Python,它也是好的一个选择,AI兴起肋力了Python。