中国开发网: 论坛: 程序员情感CBD: 贴子 613128
张秋桥: 今天踩到一颗php的粑粑雷。
事情是这样的。

我私人公司(不要误会,是那种一呀一匹猎马,一呀一杆枪的公司)的一个客户急件告诉我,一个程序不work。因为他是敝公司最大的客户,也是最不讨价还价的一位,所以必须立刻答复。

我的程序是用网上download的一个库做的,该库除了有点不必要的复杂外,效果是不错的,因此我就采用了,并且也在测试环境里运行良好,在发布到客人的主机上的时候,我也注意到一点,就是管理员登陆以后被导引到了普通用户的页面而不是控制面板,当时时间紧迫,我在测试环境里又试了试,没有问题,加上其他事情还很多,也就睁一只眼闭一只眼滑了过去,告诉客人要手工转到控制面板,客人也没有异议。

一检测,我立刻发现客人的主机是php4.4.8的,心里一沉,我用的是5.2.5,而且已经把4.x从机器上清除了出去,时间紧迫,我来不及装php4.4.8,于是直接看了看那个库的代码,仗着有点经验,在几个地方设置了输出语句,放到客人机器上,运行之下,居然全是正确的输出,只是结果不对,这下我可慌了,又设置了更多的输出,全部正确,我开始怀疑我设置的东西了,不断看代码,设置输出,时间就这么过去了4小时,人也毛了。

终于决定回到起点,在自己的机器上装上了php4.4.8,没有用10分钟,就发现了问题。这个库的里面有一个类,姑且称为c,c的内部变量中有一些是其他的类,在初始化这些类的时候,它把自己作为引用传给了这些类,这些类会修改c的状态。我在debug里面看到,当这些类修改了它内部引用的c的状态以后,c的其他内部变量类引用的c的状态全部得到了修改(其实应该就是c本身),但是c本身没有,就好像c不是被引用的!我只好把几处对c->状态变量 的使用改成c->任意一个内部变量类->c->状态变量,这样程序就在php4.4.8里面正确运行了。我的输出语句输出的都没有问题,问题是状态的改变居然没有反应到c里面。修改之后,管理员的动作也正常了。

这应该是php4.4.8的bug了,5.2.5完全正常。引用语法是php4的。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录