PHP的问题:全面阐述PHP网站设计的问题(5)
标准库
Perl“某些需要汇编”。Python是“batteriesincluded”。PHP是“厨房水槽,它来自加拿大,但所有的水龙头用C贴牌”。
概括
没有类型系统。你可以编译PHP,但必须通过php.ini指定要加载什么,选项因扩展部分存在(將它们的内容注入到全局名称空间中)或不存在。
因为名称空间是最近才有的特性,标准库一点没被打乱。在全局名称空间中有上千个函数。
库的某些部分很不一致。
下划线对无下划线:strpos/str_rot13,php_uname/phpversion,base64_encode/urlencode,gettype/get_class
“to”对2:ascii2ebcdic,bin2hex,deg2rad,strtolower,strtotime
Object+verb对verb+object:base64_decode,str_shuffle,var_dumpversuscreate_function,recode_string
参数顺序:array_filter($input,$callback)versusarray_map($callback,$input),strpos($haystack,$needle)versusarray_search($needle,$haystack)
前缀混乱:usleepvsmicrotime
Caseinsensitivefunctionsvaryonwheretheigoesinthename.
大概一半的数组函数以array_开头。剩下的不是。
厨房水槽。库包括:
绑定ImageMagick,绑定GraphicsMagick(ImageMagick的派生),少量的几个函数能检测EXIF数据(其中ImageMagick已经可以做到)
解析bbcode的函数,一些非常特殊的标记,被几个少量的论坛包使用。
太多XML包。DOM(OO),DOMXML(not),libxml,SimpleXML,“XMLParser”,XMLReader/XMLWriter,和一大砣我不能认出的东西就省略了。当然会有些不同,你可以自由的弄清晰它们的区别。
绑定了两个特别的信用卡处理器,SPPLUS和MCVE.什么?
三种访问MySQL数据库的方式:mysql,mysqli,和PDO抽象的一些东西。
C影响
它需要拥有的自己的符号。PHP是个高层的,动态类型的语言。然后大量的标准库的部分仍然只是围绕CAPIS的薄层封装,伴随着下面的东西:
”Out”参数,尽管PHP可以返回ad-hoc哈希或毫不费力的返回多参数。
至少一打的函数是为了获取某子系统的最近一次错误(见下文),尽管PHP已存存异常处理功能8年了。
有个mysql_real_escape_string,尽管已有个具有相同参数的mysql_escape_string,仅仅因为它是MySQLCAPI的一部分。
全局行为却是非全局功能的(如MySQL)。使用多个MySQL连接需要显示的对每个函数调用传递连接句柄。
包装器真的,真的,真的很薄。例如,调用了dba_nextkey而没调用dba_firstkey將出现段错误。
有一堆的ctype_*函数(如ctype_alnum)映射类似名称的C字符函数,而不是如,isupper.
Genericism
如果函数相做两件略有不同的事,PHP就搞出两个函数。
你怎样反向排序?在Perl中,你可以用{$b<=>$a}。在Python中,你可能用.sort(reverse=True)。在PHP中,有个特别的函数叫rsort()。
那些看起来像Cerror的函数:curl_error,json_last_error,openssl_error_string,imap_errors,mysql_error,xml_get_error_code,bzerror,date_get_last_errors,还有其它的吗?
排序函数:array_multisort,arsort,asort,ksort,krsort,natsort,natcasesort,sort,rsort,uasort,uksort,usort
文本检索函数:ereg,eregi,mb_ereg,mb_eregi,preg_match,strstr,strchr,stristr,strrchr,strpos,stripos,strrpos,strripos,mb_strpos,mb_strrpos,plusthevariationsthatdoreplacements
有大量的别名:strstr/strchr,is_int/is_integer/is_long,is_float/is_double,pos/current,sizeof/count,chop/rtrim,implode/join,die/exit,trigger_error/user_error…
scandir返回一个当前给出目录的文件列表。而不是(可能有益)按返回目录顺序返回,函数返回一个已排序的文件列表。有个可选的参数可以按字母逆顺返回。这些用于排序很显然很不够。
str_split將字符串拆成等长的块。chunk_split將字符串拆成等长的块,然后用个分隔符连接。
读取压缩文件需要一套单独的函数,取决于格式。有六套函数,它们的API都不同,如bzip2,LZF,phar,rar,zip,和gzip/zlib
因为使用参数数组调用函数是如此的别扭(call_user_func_array),所以有些配套的像printf/vprintf和sprintf/vsprintf.它们做相同的事,但一个带多个参数,另一个带参数数组。