Как исправить «Неперехваченную ошибку: вызов неопределенного метода» в PHP

Мне было поручено перенести веб-сайт 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">&times;</button>' . "\n";
          $alertBox_string .= $contents[$i]['text'];

          $alertBox_string .= '  </div>' . "\n";
      }

      if ($alert_output == true) echo $alertBox_string;
        return $alertBox_string;
     }
  }

Кто-нибудь знает, почему это происходит? Я разместил этот точный вопрос на форумах OSCommerce, но пока нет ответа, поэтому я подумал, что спрошу здесь, если кто-нибудь из вас, добрые люди, сможет помочь.


person Rich    schedule 08.05.2019    source источник
comment
Не существует метода под названием alertBlock. Какой вопрос?   -  person Jonnix    schedule 08.05.2019
comment
Подождите, вы пытаетесь назвать весь класс alertBlock? Возможно, вы хотите вместо этого new alertBlock?   -  person Qirel    schedule 08.05.2019
comment
Извините, но мои навыки php с классами и объектами не так хороши, я боюсь. Не могли бы вы подробнее рассказать об использовании нового alertBlock?   -  person Rich    schedule 08.05.2019
comment
Просто создайте экземпляр класса alertBlock. Ваш код внутри этого класса будет выполняться автоматически   -  person Zain Farooq    schedule 08.05.2019


Ответы (2)


До версии PHP 7.0 вы могли определить конструктор класса, написав функцию с тем же именем, что и у класса, что, по-видимому, имеет место здесь: extends alertBlock и $this->alertBlock().

Теперь такое поведение устарело: конструкторы PHP

Конструкторы старого стиля УСТАРЕЛИ в PHP 7.0 и будут удалены в будущей версии. Вы всегда должны использовать __construct() в новом коде.

Вы можете изменить свой $this->alertBlock(args) с помощью parent::__construct(args)

person Joffrey Schmitz    schedule 08.05.2019

Вы должны создать метод с другим именем из класса в классе «alertBox», после чего вы сможете легко получить доступ к методу этого класса!

person Mr. Jay Patel    schedule 08.05.2019