相信大家对ecshop都比较熟悉了吧 一个可以说是老得不能更老,但依旧活跃在各大社区 的电商系统,不知这样说大家会不会反对,废话不多说,现在开始修改关于升级PHP版本所出现的错误吧。
开始之前 先来普及 一下关于php版本之间的变化 在ecshop中所引走的问题吧。
其实主要是归三大类:
第一类,类的规范发生变化。
1, 类中的函数如果要使用 obj::method(); 这样的方法调用,哪么这个method必须要是静态的方法,也就是要在方法 前用static定义 static function method();
2,类中构造方法(function __CONSTUCT()) 与 类中与类名相同的方法 如:
class a{ function a(){}; function __construct(){}; }
这里是php4与php5的区别
PHP4中构造方法是一个与类同名的方法,而从PHP5开始,用__construct()做为构造方法,但仍然支持PHP4的构造方法。如果同时使用的话,如果 同名方法在前的话,则会报错..所以 。这也是一些支付接口等类经常报错的地方,大家只要调换一下 构造方法 与 同名方法 的位置就可以了。
如以下的报错:Strict standards: Redefining already defined constructor for class
alipay in \includes\modules\payment\alipay.php on line 85Call Stack
第二类,一些语法的变动。
1,在5.5中,不再使用/e了 如果要使用这功能 请用preg_replace_callback 来替换 preg_relace(/e,'',$x); 这种写法,其中报错最多的就是includes/cls_template.php
最常见的代码就是 cls_template.php 1073行
将
/* 将模板中所有library替换为链接 */ $pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se'; $replacement = "'{include file='.strtolower('\\1'). '}'"; $source = preg_replace($pattern, $replacement, $source);
改为-》
/* 将模板中所有library替换为链接 */ $pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s'; $replacement = "'{include file='.strtolower('\\1'). '}'"; $source = preg_replace_callback($pattern, function($r){ return "{include file='".$r[1]."'}";}, $source);
其它同样的错误在这文件中出现多次 ,修改方法 是一样的。不在此列举了。
2,不允许向方法传入引用 。
这个报错的地方也不少。意思就是说以后不能向方法中传入引用。如:
function(&$arr){}
这种写法是错的的,也包括ecshop中报: Strict standards: Only variables should be passed by reference in \includes\lib_main.php on line 1329
$ext = end(explode('.', $tmp)); //修改为: $ext = explode('.',$tmp); $ext = end($ext);
3,废除一些函数。列表我就不列出来了 ecshop使用最多的就是
mktime();了,现在统一使用time();
修改过以上的问题,ecshop基本在5.4+上运行是没有问题的了。。