我已经获得了将OSCommerce网站从运行PHP 5.3.3的服务器迁移到运行PHP 7.0.33的服务器的任务。当前的实时网站使用的是OSCommerce版本2.3.4,从OSC论坛上的阅读中可以了解到,当迁移到较新的PHP服务器时,这将导致很多错误。
理想情况下,我应该将OSC升级到最新的稳定版本,但是要集成很多自定义代码绝对是一场噩梦,此外,我还受时间限制,无法移动站点并重新启动并运行它。
我已经清除了许多基本的错误和警告,但是我遇到的一个错误是对“ messageStack”类的调用,该类显示一个ajax / jquery信息框,以显示添加到购物车中的项目或出现的问题。表格等。
错误是:
致命错误:未捕获错误:调用未定义的方法 messageStack :: alertBlock()在 /home/xxxx/public_html/xxxx/includes/classes/message_stack.php:66 堆栈跟踪:#0 /home/xxxx/public_html/xxxx/includes/modules/product_listing.php(4): messageStack-> output('product_action')#1 /home/xxxx/public_html/xxxx/index.php(227): include('/ home / xxxx ...')#2 {main}被抛出 /home/xxxx/public_html/xxxx/includes/classes/message_stack.php 在第66行
有问题的行是:
return $this->alertBlock($output);
message_stack.php
class messageStack extends alertBlock {
// class constructor
function __construct() {
$this->messages = array();
if (isset($_SESSION['messageToStack'])) {
for ($i=0, $n=sizeof($_SESSION['messageToStack']); $i<$n; $i++) {
$this->add($_SESSION['messageToStack'][$i]['class'], $_SESSION['messageToStack'][$i]['text'], $_SESSION['messageToStack'][$i]['type']);
}
unset($_SESSION['messageToStack']);
}
}
// class methods
function add($class, $message, $type = 'error') {
if ($type == 'error') {
$this->messages[] = array('params' => 'class="alert alert-danger alert-dismissible"', 'class' => $class, 'text' => $message);
} elseif ($type == 'warning') {
$this->messages[] = array('params' => 'class="alert alert-warning alert-dismissible"', 'class' => $class, 'text' => $message);
} elseif ($type == 'success') {
$this->messages[] = array('params' => 'class="alert alert-success alert-dismissible"', 'class' => $class, 'text' => $message);
} else {
$this->messages[] = array('params' => 'class="alert alert-info alert-dismissible"', 'class' => $class, 'text' => $message);
}
}
function add_session($class, $message, $type = 'error') {
if (!isset($_SESSION['messageToStack'])) {
$_SESSION['messageToStack'] = array();
}
$_SESSION['messageToStack'][] = array('class' => $class, 'text' => $message, 'type' => $type);
}
function reset() {
$this->messages = array();
}
function output($class) {
$output = array();
for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) {
if ($this->messages[$i]['class'] == $class) {
$output[] = $this->messages[$i];
}
}
return $this->alertBlock($output);
}
function size($class) {
$count = 0;
for ($i=0, $n=sizeof($this->messages); $i<$n; $i++) {
if ($this->messages[$i]['class'] == $class) {
$count++;
}
}
return $count;
}
}
和alertbox.php
class alertBlock {
// class constructor
function __construct($contents, $alert_output = false) {
$alertBox_string = '';
for ($i=0, $n=sizeof($contents); $i<$n; $i++) {
$alertBox_string .= ' <div';
if (isset($contents[$i]['params']) && tep_not_null($contents[$i]['params']))
$alertBox_string .= ' ' . $contents[$i]['params'];
$alertBox_string .= '>' . "\n";
$alertBox_string .= ' <button type="button" class="close" data-dismiss="alert">×</button>' . "\n";
$alertBox_string .= $contents[$i]['text'];
$alertBox_string .= ' </div>' . "\n";
}
if ($alert_output == true) echo $alertBox_string;
return $alertBox_string;
}
}
有人知道为什么会这样吗?我已经在OSCommerce论坛上发布了这个确切的问题,但是还没有答复,所以我想在这里问一下,以防你们中的任何人都可以提供帮助。
答案 0 :(得分:0)
您必须在“ alertBox”类中创建与该类不同名称的方法,然后才能轻松访问该类的方法!
答案 1 :(得分:0)
直到PHP 7.0,您可以通过编写与该类名称完全相同的函数来定义类的构造函数,在这里似乎是这种情况:extends alertBlock
和$this->alertBlock()
。
现在,不建议使用此行为:PHP constructors
旧样式的构造函数在PHP 7.0中已弃用,并将在以后的版本中删除。您应该始终在新代码中使用__construct()。
您可以使用$this->alertBlock(args)
来修改parent::__construct(args)