设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

挑刺PHP:全面解析PHP的糟糕设计

2012-4-22 10:25| 发布者: joejoe0332| 查看: 15583| 评论: 1|原作者: OSCHINA|来自: OSCHINA

摘要: 译者注:这篇文章很长,而且可能读起来很乱,很难懂 前言 我的脾气古怪. 我会抱怨很多东西. 这个星球上大多数技术我都不喜欢. PHP不仅使用起来尴尬, 还有要嘛我想要的不适合, 要嘛不是最令人满意, 要嘛违背我的信 ...

C 影响

    它需要拥有的自己的符号. PHP 是个高层的, 动态类型的语言. 然后大量的标准库的部分仍然只是围绕 C APIS 的薄层封装, 伴随着下面的东西: 

>>    "Out" 参数, 尽管 PHP 可以返回 ad-hoc 哈希或毫不费力的返回多参数. 

>>    至少一打的函数是为了获取某子系统的最近一次错误(见下文), 尽管 PHP 已存存异常处理功能8年了.   

>>     有个 mysql_real_escape_string, 尽管已有个具有相同参数的 mysql_escape_string, 仅仅因为它是 MySQL C API 的一部分.

>>    全局行为却是非全局功能的(如 MySQL). 使用多个 MySQL 连接需要显示的对每个函数调用传递连接句柄.

>>    包装器真的, 真的, 真的很薄. 例如, 调用了 dba_nextkey 而没调用 dba_firstkey 將出现段错误.

>>    有一堆的 ctype_* 函数 (如 ctype_alnum) 映射类似名称的 C 字符函数,  而不是如, isupper. 

Genericism

    如果函数相做两件略有不同的事, PHP 就搞出两个函数.

    你怎样反向排序? 在 Perl 中, 你可以用 { $b <=> $a}. 在 Python 中, 你可能用 .sort(reverse = True). 在 PHP 中, 有个特别的函数叫 rsort().    

>>    那些看起来像 C error 的函数: 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, plus the variations that do replacements

>>    有大量的别名: 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. 它们做相同的事, 但一个带多个参数, 另一个带参数数组.

文本

>>    preg_replace 带 /e (eval) 标志的將用待替换的字符串替换匹配的部分, 然后 eval 它.    

>>    strtok 的设计显然是和 C 函数等效的, 由于很多原因, 已被认为是个坏注意. PHP 可以轻易的返回一个数组(而这在C中别扭), 很多的hack strtok(3) 用法 (修改字符串某处), 在这里不能使用.

>>    parse_str 解析查询字符串, 从函数名看不出任何迹象. 而它会 register_globals 并转存查询字符串到本地范围变量中, 除非你传递一个数组来填充. (当然, 什么也不返回)

>>    碰到空分隔符, explode 会拒绝分割. 每个其它的字符串拆分实现采取这种作法的意思应该是把字符串应拆分成字符; PHP有一个拆分函数, 令人迷惑的称为 str_split 而却描述为 "將字符串转成数组". 

>>    格式化日期, 有 strftime, 像 C API 处理本地语言环境一样. 当然也有 date, 完全不同的语法而仅用于 English. 

>>    "gzgetss -- 获取 gz 文件的行指针并去除 HTML 标记." 知道了这一系列函数的概念, 让我去死吧.

>>    mbstring

    >>    都是关于 "multi-byte", 解决字符集的问题.

    >>    仍然处理的是普通字符串. 有个单一的全局"默认"的字符集. 一些函数允许指定字符集, 但它依赖于所有的参数和返回值.

    >>    提供了 ereg_* 函数, 但这些都被废弃了. preg_* 很幸运, 用一些 PCRE-specific 标记, 它们能理解 UTF-8. 

系统和反射

>>    有一大堆的函数, 聚焦于文本和变量. 压缩和提取仅是冰山一角. 

>>    有几种方式让PHP动态, 咋一看没有什么明显的不同或相对好处. 类工具不能修改自定义类; 运行时工具取代了它并能修改自定义的任何东西; Reflection* 类能反射语言的大部分东西; 有很多独特的函数是为了报告函数和类的属性的. 这些子系统是独立, 相关, 多余的吗?

>>    get_class($obj) 返回对象的类名称. get_class()返回被调用函数中的类的名称. 撇开这些不说, 同一个函数会做完全不同的事情: get_class(null)... 行为象后者. 因此面对一个随机的变量, 你不能信任它. 惊讶吧!

>>    stream_* 类允许实现自定义的流对象给fopen和其它的内建的类似文件处理的东西使用. 由于几个内部原因, "通知" 不能被实现. 

>>    register_tick_function 能接受闭包对象. unregister_tick_function 不行; 相反, 它会抛出错误, 抱怨闭包不能转换成字符串.     

>>    php_uname 告知你当前操作系统相关东西. 

>>    fork 和 exec 不是内建的. 它们来自 pcntl 扩展, 但默认不包含. popen 不提供 pid 文件.

>>    session_decode 用于读取任意的 PHP session 字符串, 但仅当有个活跃的 session 时才工作. 它转存结果到 $_SESSION 中, 而不是返回它的值.      

杂项 

>>    curl_multi_exec 不改变 curl_error 当出错的时候, 但它改变 curl_error. 

>>    mktime 的参数是有顺序的: hour, minute, second, month, day, year

数据操纵

    程序什么都不是, 除了咀嚼和吐出数据以外. 大量的语言围绕着数据操纵设计, 从 awk 到 Prolog 到 C. 如果语言无法操纵数据, 它就无法做任何事.


酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部