Могу ли я вернуть старое поведение __tostring () в PHP 5.3? - PullRequest
2 голосов
/ 10 марта 2011

Мне нужно переместить веб-сайт (написанный мной (не мной), поэтому просто не нужно обновлять CMS) на сервер PHP 5.3.В коде жалуется:(), приняв параметр ... который теперь устарел в пользу новой __tostring () для PHP 5.3 ".Вот код:


public function __toString($format = 'Y-m-d')
{
  // the next is the line #182, the line #183 mentioned in the error message is the closing brace
  return date($format, $this->_stamp);
}

Есть ли что-то вроде параметра php.ini, который я могу настроить, чтобы вернуть это к работе?

Я не разработчик PHP, и при этом я не слишком многожелая погрузиться в изучение и модификацию кода, который был написан какой-то аутсорсинговой компанией в прошлом в компании, в которой я работаю.Моя задача - переместить веб-сайт с провайдера общего хостинга на выделенный сервер, который я администрирую (там я запускаю Ubuntu 10.04 LTS Server) и который я бы предпочел не переходить на PHP 5.2.Было бы замечательно, если бы я мог просто заставить это работать с некоторой магией конфигурации.Я боюсь, что если я изменю метод, то все это перестанет работать, как ожидалось.

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Вы не можете заставить __toString () снова принимать параметры.Подпись метода должна быть поверхностной.(Я согласен, что это излишнее осуждение, и почему они не просто выбросили E_DEPRECATED вместо генерации фатальной несовместимости, не очень разумно.)

Единственный обходной путь - использование func_get_args() вместо реальных параметров:

class EmptyString { 
    function __toString() {
        print_r(func_get_args());
        return "";
    }
}

Это заставит 5.3 вызвать неявную __toString для "$so";, но все же разрешить ручное $so->__toString(_WITH, "params");.

Эта схема не допускает простоты значений параметров по умолчанию:курс.А поскольку ваша цель - заставить работать устаревшее приложение, этого недостаточно.Вам необходимо реализовать этот обходной путь в базовом классе, а также адаптировать существующие методы __toString в __oldString и вызывать их в режиме Compat.Немного переписать не получится.


Без каких-либо сложных методов-оболочек ваш конкретный пример кода адаптировался:

public function __toString()
{
    $format = func_get_arg(0)   or   $format = 'Y-m-d';

    return date($format, $this->_stamp);
}
2 голосов
/ 10 марта 2011

Если проблема только в этом классе, вы можете обновить код этого класса.

Создать метод переопределения __toString (), который принимает параметры, этот вызов является родительским или полностью переписать код метода(Я думаю, что это не так сложно).

Но для получения дополнительной информации нам нужна некоторая часть кода, чтобы разобраться с проблемой в контексте.

РЕДАКТИРОВАТЬ: Хорошо, ядумаю, что лучшее решение:

  1. переименуйте метод и все его вызовы.Потому что __toString зарезервировано для метода magick: printDate($fomat='Y-m-d').
  2. добавьте новый метод __toString (), который вызовет ваш printDate()

И используйте:

public function __toString()
{
    $format = isset(func_get_arg(0) ? func_get_arg(0) : 'Y-m-d';
    return date($format, $this->_stamp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...