ecshop二次開發在PHP5.4以上高版本報錯的解決方案集合
20170608更新
這個ECSHOP高版本出錯的修改是在做項目開發過程中邊做邊修改出來的,基本上支持到5.6都沒發現什么問題了,下圖是我系統運行的PHP版本情況,由于系統原因,我沒有安裝php5.6,另外,在后面如果遇到有更新的與PHP版本有關的BUG,也會在這里更新,大家可以關注。
一、include/cls_template.php
1、找到
$tag_sel = array_shift(explode(' ', $tag));
改為
$tag_arr = explode(' ', $tag); $tag_sel = array_shift($tag_arr);
2、 找到
return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
改為
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]);}, $source);
3、找到
$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" ,"stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
改為
$out = <?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r){return stripslashes(trim($r[1],'\''));}, var_export($t, true)) . ";\n";
4、找到
$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);
改為
$val = preg_replace_callback("/\[([^\[\]]*)\]/", function($r) {return '.'.str_replace('$','$',$r[1]);}, $val);
5,找到
$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se'; $replacement = "'{include file='.strtolower('\\1'). '}'"; $source = preg_replace($pattern, $replacement, $source);
改為
$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s'; $source = preg_replace_callback($pattern, function($r){return '{include file='.strtolower($r[1]). '}';}, $source);
6、類似這樣的報錯:
Deprecated: preg_replace(): The /e
modifier is deprecated, use preg_replace_callback instead in
D:\wyh\ecshop\includes\cls_template.php on line 300
(1)錯誤原因:preg_replace() 函數中用到的修飾符 /e 在 PHP5.5.x 中已經被棄用了。如果你的PHP版本恰好是PHP5.5.X,那你的ECSHOP肯定就會報類似這樣的錯誤。
(2)解決辦法:
A、將 cls_template.php的300行
return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
改為
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) { return $this->select($r[1]); }, $source);
B、將 cls_template.php
$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
改為
$out = <?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r) {return stripslashes(trim($r[1],'\''));}, var_export($t, true)) . ";\n";
C、將cls_template.php
$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);
改為
$val = preg_replace_callback("/\[([^\[\]]*)\]/", function($r) {return '.'.str_replace('$','$',$r[1]);}, $val);
D、將cls_template.php
$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se'; $replacement = "'{include file='.strtolower('\\1'). '}'"; $source = preg_replace($pattern, $replacement, $source);
改為
$pattern = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s'; $source = preg_replace_callback($pattern, function($r){return '{include file='.strtolower($r[1]). '}';}, $source);
二、include/lib_base.php
1、找到
return cls_image::gd_version();
改為
$p = new cls_image(); return $p->gd_version();
2、找到
function gd_version()
改為
static function gd_version()
三、admin/shop_config.php和sms_url.php
找到
$auth = mktime();
改為
$auth = time();
四、上傳LOGO和水印出現Strict Standards: Only variables should be passed by reference
后臺admin/shop_config.php,將兩處
$ext = array_pop(explode('.', $file['name']));
改為
$ext_tmp = explode('.', $file['name']); $ext = array_pop($ext_tmp);
五、數據庫備份出現edefining already defined constructor for class cls_sql_dump\admin\includes\cls_sql_dump.php on line 90
將
function __construct(&$db, $max_size =0) { $this->cls_sql_dump($db, $max_size); }
移到
function cls_sql_dump(&$db, $max_size=0)
前面
七、出現Non-static method cls_sql_dump::get_random_name() admin\database.php on line 64
打開includes\cls_sql_dump.php 479行 ,將
function get_random_name()
修改為
static function get_random_name()
八、支付出錯:Strict Standards: Redefining already defined constructor for class kuaiqian in /data/web/includes/modules/payment/kuaiqian.php on line 83 Strict Standards: Redefining already defined constructor for class cod in /data/web/includes/modules/payment/cod.php on line 82
解決辦法,將所有的構造函數放到前面,如alipay.php
將
function __construct() { $this->alipay(); }
移到
function alipay() { }
前面
九、出現Non-static method cls_sql_dump::get_random_name() admin\database.php on line 64
打開includes\cls_sql_dump.php 479行
function get_random_name()
修改成
static function get_random_name()