这个错误比较蹊跷,所以拿出来说一说。环境:php 5.2.3, adodb 5.04, ubuntu 7.10 Gutsy.
前两天为了[使用adodb和sqlite3](384),就把adodb升级成了只支持php5的adodb5(5.0.4),过两天发现另外一个使用sybase的程序不正常了,运行时不工作直接退出,没有任何错误信息,通过添加die('hi');
的方式定位到错误发生在$db = &ADONewConnection('sybase');
这一行。
adodb对sybase的支持一直不强,不过还没有到不工作的地步,但这个错误没有任何提示,实在是不好找,无奈之下用ZendStudio来跟踪一下,弄了一个最简单的小程序,当然,它是不工作没错误直接结束:
#! /usr/bin/php
<?php
require_once('adodb/adodb.inc.php');
$db = &ADONewConnection('sybase');
print_r($db);
$db->Connect('server3', 'sa', '', 'dbname');
$rs = $db->Execute('select 1');
print_r($rs);
?>
ZendStudio下Debug就报错了:
Compile Error: /home/fwolf/dev/include/adodb5/drivers/adodb-sybase.inc.php line 271 - Cannot make static method ADOConnection::UnixDate() non static in class ADODB_sybase
拿着错误信息上网一查,原来是在adodb-sybase.inc.php文件中,180行开始的地方定义了两个函数UnixDate()和UnixTimeStamp()(提示错误在271行,271行是类ADODB_sybase的定义结束位置,所以这个错误是在代码编译是产生的,而不是运行时),而这两个函数在adodb.inc.php中是作为static函数定义的(2481、2505行),php5不允许覆盖static函数(这个在oop中好像是叫重载,太长时间没摸书本,记不清了),所以产生编译错误,程序中止。在adodb.inc.php的4089行,包含adodb-sybase.inc.php的时候又加上了@
符号:
@include_once($file);
所以错误信息被屏蔽,不显示了。ZendStudio由于Debug的原因,可能所有的错误都捕捉到了,忽略@
。去掉@
之后,直接运行就也可以报错了。
问题弄清楚了,如何改呢,我想大概有两种方式:
- 修改adodb.inc.php,不将UnixDate()函数定义为static。
- 修改adodb-sybase.inc.php,取消两个函数的重复定义。
相比之下,觉得第一种方法更好一些,第二种方法可能会引发其它的错误。所以改下来一共是去掉四个static:
Line 2481: ADOConnection::UnixDate()
Line 2505: ADOConnection::UnixTimeStamp()
Line 3204: ADORecordSet::UnixDate()
Line 3215: ADORecordSet::UnixTimeStamp()
简单测试了一下,基本工作正常。
参考
- [Cannot make static method ADOConnection::UnixDate() non …](http://phplens.com/lens/lensforum/msgs.php?id=17112)
- [[ 1838844 ] Cannot make static method ADOConnection::UnixDate() non …](https://sourceforge.net/tracker/index.php?func=detail&aid=1838844&group_id=42718&atid=433976)
PS: ZendStudio使用单独的一套php.ini,放在/path/to/ZendStudio-5.5.0/bin/php5
目录下,我总是忘记,每次include path不对劲的时候都要找半天。