Мне нужно переместить веб-сайт (специально написанный (не мной), поэтому просто обновление CMS не является вариантом) для сервера PHP 5.3. Код жалуется:
Fatal error: Method cDate::__tostring() cannot take arguments in ...\lib.datetime.php on line 183
Я искал googled, чтобы выяснить, что проблема в том, что «с PHP 5.3 магический метод __tostring () больше не принимает никаких параметров«, »… реализует свой __tostring (), принимая параметр …, который теперь устарел в пользу новой __tostring () для PHP 5.3 ". Вот код:
public function __toString($format = 'Ym-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), и я бы предпочел не переходить на PHP 5.2. Было бы здорово, если бы я мог просто заставить его работать с маской конфигурации. Я боюсь, что если я изменю метод, то все это перестанет работать, как ожидалось.
Вы не можете повторно использовать параметры __toString (). Подпись метода должна быть неглубокой. (Я согласен, что это бессмысленное осуждение, и почему они не просто выбросили E_DEPRECATED вместо генерации фатальной несовместимости, это не очень разумно.)
Единственным обходным func_get_args()
является использование func_get_args()
вместо реальных параметров:
class EmptyString { function __toString() { print_r(func_get_args()); return ""; } }
Это приведет к тому, что 5.3 вызовет неявный __toString для "$so";
, но все же разрешить руководство $so->__toString(_WITH, "params");
,
Эта схема не позволяет, конечно, простоты параметров по умолчанию. И поскольку ваша цель – заставить устаревшее приложение работать, этого недостаточно. Вам необходимо реализовать это обходное решение в базовом классе и адаптировать существующие методы __toString в __oldString и вызвать их в режиме совместимости. Нет никакого способа переписывать.
Без каких-либо сложных методов обертки ваш конкретный пример кода адаптирован:
public function __toString() { $format = func_get_arg(0) or $format = 'Ym-d'; return date($format, $this->_stamp); }
Если проблема только в этом классе, вы можете обновить код этого класса.
Создайте метод переопределения __toString (), который принимает параметры, которые являются родительскими или полностью переписывают код метода (я думаю, что это не так сложно).
Но для получения дополнительной информации нам нужна часть кода для решения проблемы в контексте.
EDIT: Хорошо, я думаю, лучшее решение:
printDate($fomat='Ym-d')
. printDate()
И используйте:
public function __toString() { $format = isset(func_get_arg(0) ? func_get_arg(0) : 'Ym-d'; return date($format, $this->_stamp); }