Устарело - методы с тем же именем, что и их класс, не будут конструкторами в будущей версии PHP

В php v 5 с этими кодами php нет проблем:

<?php

$ERRORS=array("INVALID_ERROR"=>"Invalid/Unknown error",
              "ACCESS_DENIED"=>"Access Denied",
              "INVALID_INPUT"=>"Invalid Input",
              "INCOMPLETE_REQUEST"=>"INCOMPLETE REQUEST"
            );

class Error
{ /* This Class is for errors reported from core or interface.
     Normally errors should consist of lines of ( keys and  messages), formated in a string like "key|msg"
     key shows what is error about and msg is the error message for this situation

  */
    function Error($err_str)
    {
        $this->raw_err_str=$err_str;
        $this->err_msgs=array();
        $this->err_keys=array();
        $this->__splitErrorLines();

    }

    function __splitErrorLines()
    {
        $err_lines=split("\n",$this->raw_err_str);
        foreach($err_lines as $line)
            $this->__splitError($line);
    }

    function __splitError($err_str)
    {
        $err_sp=split("\|",$err_str,2);
        if(sizeof($err_sp)==2)
        {
            $this->err_msgs[]=$err_sp[1];
            $this->err_keys[]=$err_sp[0];
        }    
        else
        {
            $this->err_msgs[]=$err_str;
            $this->err_keys[]="";
        }
    }

    function getErrorKeys()
    {/*
        Return an array of error keys
     */

        return $this->err_keys;
    }

    function getErrorMsgs()
    {/*
        Return array of error msgs
        useful for set_page_error method of smarty
     */
        return $this->err_msgs;
    }

    function getErrorMsg()
    {/* 
        Return an string of all error messages concatanated
     */
        $msgs="";
        foreach ($this->err_msgs as $msg)
            $msgs.=$msg;
        return $msgs;
    }

}

function error($error_key)
{/* return complete error message of $error_key */
    global $ERRORS;
    if (isset($ERRORS[$error_key]))
        return new Error($error_key."|".$ERRORS[$error_key]);
    else
        return new Error($ERRORS["INVALID_ERROR"]);
}

?>

Но после установки php v7.3.2 я получил эту ошибку:

Устарело: методы с тем же именем, что и их класс, не будут конструкторами в будущей версии PHP; У ошибки есть устаревший конструктор в /usr/local/IBSng/interface/IBSng/inc/errors.php в строке 12

Неустранимая ошибка: невозможно объявить класс Error, потому что имя уже используется в /usr/local/IBSng/interface/IBSng/inc/errors.php в строке 12

Что означает эта фатальная ошибка и как ее исправить?


person SilverLight    schedule 13.02.2019    source источник
comment
Я думаю, что устаревание - это отдельный вопрос от фатальной ошибки.   -  person Don't Panic    schedule 14.02.2019


Ответы (2)


Просто добавить к

@Powerlord Отличный ответ

Я бы также переименовал эту функцию / метод

function Error

В PHP4 конструктор назывался так же, как класс. Это имело некоторые ограничения на рефакторинг кода, копирование классов и т. Д. Так как вы должны были не забыть переименовать их.

В коде неясно, изначально предполагалось, что это будет метод __construct или нет. Никакие внутренние свойства класса не изменяются (внешние) по отношению к этому методу, поэтому его можно вызывать несколько раз для каждого экземпляра. Но если это «конструктор», то непременно назовите его так __construct()

PS. вы можете захотеть «пространство имен» или также переименовать этот класс, как указано в ответе @ Powerlord.

И я бы не стал использовать имена типов __method, потому что это некрасиво для меня ... lol

Я набрался опыта в PHP из-за этих ошибок ... lol. Моя первая профессиональная работа заключалась в переносе сайта с 4.x на 5.3 - это было примерно в 2008 году (спасибо за воспоминания PHP4)

person ArtisticPhoenix    schedule 13.02.2019
comment
Я думаю, вы, вероятно, имеете в виду переименовать function Error в public function __construct() - person RiggsFolly; 14.02.2019
comment
Нет, если это не было конструктором. - person ArtisticPhoenix; 14.02.2019
comment
Насколько я помню, это была функция функции, названной так же, как имя класса, не так ли? - person RiggsFolly; 14.02.2019
comment
Это метод с тем же именем, что и конструктор class Class Error{ public function Error } = PHP4.x. Но я не понимаю, почему метод Error нельзя вызывать повторно, поскольку нет другой модификации внутренних данных для класса вне его. Так что теоретически вы могли бы вызывать $E = new Error(); $E->Error(...) несколько раз, если бы не ошибки. - person ArtisticPhoenix; 14.02.2019
comment
Запрашиваемое сообщение об устаревании - Methods with the same name as their class will not be constructors in a future version of PHP; Error has a deprecated constructor in /usr/local/IBSng/interface/IBSng/inc/errors.php on line 12 - person RiggsFolly; 14.02.2019
comment
В настоящее время он функционирует как конструктор. Вы знаете, что также можно вызвать $object->__construct() явно - person Don't Panic; 14.02.2019
comment
@ Don'tPanic - да, я знаю (в конце концов, это публично), но я никогда особо не думал об этом ... :-p - person ArtisticPhoenix; 14.02.2019

Вы получаете сообщение об ошибке, потому что PHP7 имеет свой собственный класс Error, поэтому вы не могу назвать свой собственный класс Error.

person Powerlord    schedule 13.02.2019
comment
На самом деле это следующая ошибка, которую они получат. - person ArtisticPhoenix; 14.02.2019
comment
@ArtisticPhoenix Спросили, что это за фатальная ошибка. Как упоминалось ранее в «Не паникуйте», предупреждение не связано с фатальной ошибкой. - person Powerlord; 14.02.2019
comment
Хорошо, я понял ... Я только что прочитал первую. - person ArtisticPhoenix; 14.02.2019