批评一下 PHP
March 23, 2008 10:43 pm | In Tech | 3 Comments | hidePHP 里函数多如牛毛,加进去又没什么统一规划,搞得现在成了命名法大杂烩,比如:
- obj_verb 型的:array_slice() http_inflate()
- verb_obj 型的:create_function() parse_str()
- verbobj 不加下划线:setcookie() addslashes()
- 直接把 POSIX 传统函数拿来用的:opendir() fopen()
- 这种算什么呢:error_reporting() htmlspecialchars() 特别是这个 htmlspecialchars 命名毫无章法
- 新老 DOM 类函数不一样:一个叫 getAttribute(),另一个叫 get_attribute()
- 你可能会说,那同类函数可能命名法就一致了吧?也不全是,日历函数:
- verb_obj:cal_days_in_month()
- 大写首字母不加下划线:JDDayOfWeek()
- 突然又全小写了:jdtounix()
(其实 PHP 函数名不分大小写,最后这俩只是文档故意添乱) 晕死。有人说,你真弱,用多了就全熟了。好吧,我是比较弱,可是我知道有人在知名大公司天天写 PHP 还是和我一样晕……PHP 函数命名为什么这么乱?给俩链接:
- 20 possible reasons why PHP function names and parameters are weird
- Do You PHP? 里第二部分:The Ugly Duckling of Programming Languages
换个话题,最近 PHP 的 substr 函数被人改坏了。
There was a small inconsistency between PHP 5.2.1 and 5.2.2. In PHP 5.2.1, substr($str, $start) returns the full $str if ($start < 0 && abs($start) > strlen($str)). But starting from PHP 5.2.2, FALSE would be returned. Before 5.2.2, this behavior was conveniently used to extract at most N last characters of a string, e.g. $str = substr($str, 30); limits $str to at most 30 characters and truncate from the beginning if necessary. However, this no longer works! See also: diff-5.2.1-5.2.2, bug 41375. This is likely to change back in PHP 5.3, given what’s recently been done on PHP_5_3 branch.
PHP Doc 有正方呼吁:This is a small inconsistency, one of those things that makes the life of a PHP programmer like hell. Bugzilla 上反方辩护:The fact that it worked up until 5.2.1 doesn’t mean that you should have used it. 这个问题其实最开始只是因为别的原因无意间改错的,但是 PHP 内部却有人坚持错误,有人报告这个问题也被归类为 Bogus(意思就是说,RTFM,回家好好读文档去)。其实文档也不明确,现在基于各种原因,PHP 5.3 分支上又改回去了,真是搬起石头砸自己的脚。
说个微软搬石头砸自己脚的故事。IE 最开始搞出 {client,offset,scroll}{Top,Width,Height,Left} 十二个很有意义的 HTML 属性用来方便的设置/获取对象大小/位置等信息,实在是一个很好很强大的发明,基本也铁定进 HTML5 了。不过 IE 里面的制造标准不明确,各类元素定义略有不同,反倒别的浏览器抄得更和谐。搞到现在的局面是,微软自己发明的东西,反倒被 QuirksMode 说成 IE 里 incorrect/buggy,不如别的浏览器“正确”,真是衰啊。
IE7 是邪恶的
February 24, 2008 11:09 pm | In Misc | 11 Comments | hide曾经有好几个美国人跟我抱怨,IE7 怎么没有刷新按钮了。
上网一搜,没发现 IE7 刷新按钮的比比皆是。有个哥们抱怨说:I can’t believe I googled on this.
我长期不用 IE,今天打开来居然也没找到刷新按钮,情急之下只好按了 F5……
其实,IE7 里面的刷新按钮被移到了地址栏右边,不再和后退、前进按钮在一起了。
十多年来我们早已熟悉的“后退、前进、刷新”的按钮序列居然被微软这帮猪头给推翻了。
这真是一个反人类的浏览器。

(小猪取自辛普森家庭电影网站)
断词换行大战
January 22, 2008 3:57 pm | In Tech | 12 Comments | hide人物介绍:
- 王强:网景(Netscape)公司老雇员,后成为 Mozilla 基金会骨干,主管外联;
- 艾利:互联网世界警察 W3C 高层,负责协调 CSS3 进度;
- 炮尔:微软(Microsoft)资深工程师,参与编写 CSS3 文字模块标准;
- 盖兹:微软创始人之一,人称盖老板。
【第一幕】2001 年 5 月,艾利给炮尔打电话。
艾利:老炮啊,我,艾大妈。
炮尔:哎呦妈呀,好久不见嘞呀,你最近忙啥呢?
艾利:我还那样,我跟你说啊,我今天没空跟你扯。明天我们这儿有个会,要开始搞 CSS3 文字模块了,你来不来插一腿?
炮尔:啥?你们 CSS2 都没搞利落呢怎么就上 CSS3 了?我告诉你啊,上次你欠的债还没还呢,你让 Mozilla 把我们微软的 word-wrap 和 word-break 给实现了不就齐活了?还搞啥屁标准啊!
艾利:Mozilla 他们不干啊,他们非要个标准。我说,我私下早就说好让你们写标准了,你到底来不来?
炮尔:标准?啥标准?我们微软就是标准!你去外头看看多少人用我们的浏览器!
艾利:嘘,你们和网景打官司呢,别大声嚷嚷,小心 Mozilla 也告你!
炮尔:好好好,老大我服。明儿个几点开会?我今晚就飞过去。
【第二幕】第二天,W3C 会议室。
王强:炮工您好您好,很高兴见到您。听说你们 IE6 快发布了,恭喜恭喜啊!
炮尔:哪里哪里!不过我们是真的觉得这个版本很好很强大啊!
王强:听说一大批银行网站在 BETA 版上运行都有问题?嘿嘿,嘿嘿!
炮尔:这个……这个……
(艾利姗姗来迟,进入会议室)
艾利:欢迎来到 W3C,谢谢大家光临。我们 W3C 是世界上最大的互联网组织,技术实力雄厚……
炮尔:(打断)喂,你别打官腔行不行,我一会儿还要去看脱衣舞呢,难得老婆管不着我。
艾利:好那我们就直接进入正题,今天我们要协调开始 CSS3 文字模块的工作,最好下个星期就能发布一个草稿。
炮尔:大家都知道,微软早在 IE 5.5 就实现了伟大的 word-wrap 和 word-break 属性,大家只要照搬微软的文档,标准就出来了。我给大家举个例子,加了这个属性的 div,哪怕碰到再长的文字也不会把 div 撑破,比如:

王强:首先,我赞赏微软在这方面先驱的工作,但是我并不觉得我们可以把微软这两个东西拿来直接作标准,比如同样属性的 div,可能会有这样的景象:

王强:apart 一词被硬生生拆成了两行,这是不容许的。我觉得在这个断词换行领域,我们还有很长的路要走。
会议不欢而散,过了一个星期炮尔勉强拷贝了一下微软的文档发布了第一个 CSS3 文字模块草稿。
【第三幕】 一年后,2002 年 5 月,炮尔给王强打电话。
炮尔:小王啊,我去年请你看了脱衣舞秀,你怎么也不还个人情啊。这不 CSS3 文字模块二稿都快出了,你们 Mozilla 浏览器怎么在断词换行功能上连个动静都没有啊。
王强:这玩意儿不好搞啊。就上个月,我们才找中国佬谈过,各类标点符号能不能放行首行末的规则就快把我搞晕了。
炮尔:这个好办,我直接把我们的代码送给你们吧。我说,你还是给你们开发组施加一点压力,我这 CSS3 草稿发布出来就我们微软一个浏览器支持,我们律师怕人家告我们垄断那。
王强:还不光那一个操蛋的标点问题呢,这不我刚又收到一封中国佬的信,说他们新出了个规定,“毛主席”三个字中间也不能换行……
炮尔:我操,这都文革时候的事儿了,他们忽悠你呢。
王强:不光中文,别的语言也有问题。就说英语好了,一个词在什么地方断行,就是一个很技术的问题。比如 fucking,我是断成 fu-cking 呢,还是 fuck-ing,这很有讲究啊。
炮尔:你他妈骂我干嘛?
王强:我没骂您,我就是举个例子。再比方说了,德语 ss 中间不能断,阿拉伯语……
炮尔:行了,你们就不能随便先起个头,你们社区这么多免费劳动力,你起个头,大家自然就能贡献了。
王强:不瞒您说,这个断词换行我们开会认为是核心引擎功能,只能我们自己干。既然是核心,就不能随便乱搞,要搞就要搞个能用的。您看,光英文断词我们就得输进去整一个大英词典,工作量很大啊。
炮尔:好好,我理解。那你觉得啥时候能搞出来?
王强:今年吧,我们人都招好了,就等着写代码了。
【第四幕】镜头快速切换好几年的时光。
2003 年,Mozilla 基金会成立。断词换行功能毫无经济利益,被无限期搁置。
2004 到 2005 年,新版本 Firefox 连续发布,开发以短平快为宗旨,断词换行功能的呼声在 Bugzilla 上堆积如山,但 Mozilla 基金会视而不见。
2006 年,IE 7 开发组送给 Mozilla 一个蛋糕,祝贺 Firefox 2 发布。王强吃了一块蛋糕,感觉里面有异物,从嘴里拉出一张纸条:“你们他妈的怎么还不搞断词换行?”。
【第五幕】2008 年 1 月,盖兹在办公室找炮尔谈话。
盖兹:老炮啊,你看啊,我再过几个月就退休了,我这辈子就俩愿望,一个是把我发家的 BASIC 语言搞大,VB 搞得很成功,我很开心;还有一个我希望我们强大的 IE8 能成为 W3C 标准,你看,这只剩下没几个月了,你知道我退休前就这么一个心愿……
炮尔:盖老板,我很努力了,可是 W3C 一直不出 CSS3 标准,我也没办法啊。
盖兹:今年过年不是刚给他们送了一箱蚁力神吗?他们怎么不买帐。
炮尔:盖老板您有所不知啊,蚁力神出事儿了;而且 Mozilla 基金会刚给 W3C 送了一箱脑白金,恐怕 Firefox 还没钱开发断词换行功能,不让 CSS3 发布呢。
盖兹:好吧我知道了,你先出去吧。
盖兹给艾利打电话。
盖兹:艾大妈啊,我盖兹。
艾利:哎呦,您老还健在?
盖兹:我好得很,我问你啊,CSS3 咋还不发布呢,老子都快退休了。
艾利:这可不怪我啊,您给 Mozilla 基金会打个电话问问吧。对了啊,HTML 5 出草稿了,你们来不来插一腿?
盖兹:得,我不敢了,先这样吧,我还忙呢。
盖兹狠狠的拨了 Mozilla 基金会的号码。
“您好,这里是 Mozilla 基金会,捐钱请按 1,送钱请按 2,给钱请按 3,……和活人说话请按 0。”
盖兹按了 0,正好是王强接的。
“您好,这里是 Mozilla 基金会,我是王强,May I help you?”一口地道的伦敦腔。
“喂,我是盖老板,你大爷的你们到底什么时候搞他妈的断词换行?”
嘟……嘟……嘟……嘟……嘟……嘟……
(情节纯属虚构,如有雷同,实属巧合。)
路人甲:可是好像真事儿就是这样。
路人乙:笨!这叫艺术源于生活!
微软的文档……
December 11, 2007 1:04 am | In Tech | 2 Comments | hide同样是字符串里找子串的函数,微软 VB 的文档:
Returns an integer specifying the start position of the first occurrence of one string within another.
Public Shared Function InStr(_ ByVal String1 As String, _ ByVal String2 As String, _ Optional ByVal Compare As CompareMethod _ ) As IntegerParameters
String1
Required. String expression being searched.String2
Required. String expression sought.
读完了一头雾水,TMD 到底哪个参数是要找的子串??being searched?sought??我英语不好也不要这么欺负我啊。再看微软 VC++ 类似函数的文档:
Return a pointer to the first occurrence of a search string in a string.
char *strstr( const char *str, const char *strSearch ); // C onlyParameters
str
Null-terminated string to search.strSearch
Null-terminated string to search for.Return Value
Returns a pointer to the first occurrence of strSearch in str …
VC++ 里解释比 VB 的稍好一些,但是还是不清不楚的,功能说明为啥不写清楚哪个 string 是哪个呢?变量名为什么要写得这么诡异呢?参数说明里一个是 search,一个是 search for,TMD 又欺负我英语差!像这种常用函数,一般人都知道大概怎么用,只是偶尔不确定看一下参数顺序,你这么个文档还得让人费脑细胞琢磨,要你何用!再看 PHP 里类似的函数:
int strpos ( string $haystack, mixed $needle [, int $offset ] )Returns the numeric position of the first occurrence of needle in the haystack string.
PHP 这个文档光看参数名就足以明白参数顺序了,看了功能解释就更清楚了。MacOS 的 man page:
char *strstr(const char *big, const char *little);The strstr() function locates the first occurrence of the null-terminated string little in the null-terminated string big.
有一百种方法可以把这个函数的参数顺序写的很明确,但是微软偏偏选择了不明朗的写法。想起一般微软的程序很少有人去看 HELP 解决问题,而 MacOS 和 *nix 下面看文档则是家常便饭,看来微软文档无用论还是很有道理的……
Tags: documentation, microsoft, usability
This weblog is licensed under a
Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.