В выходные я переместил приложение с сервера Ubuntu 11.04 (Natty Narwhal) на сервер Red Hat Enterprise Linux (RHEL). Мой журнал ошибок заполнен ошибками PHP в строке темы, ссылающейся на следующую функцию:
function wfTalkHereArticleFromTitle( &$title, &$article ) { global $wgRequest, $wgTalkHereNamespaces; if (isset($title->noTalkHere)) return true; //Stop recursion $action = $wgRequest->getVal( 'action' ); $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); if ($action == 'purge') $action = NULL; //"purge" is not considered an action in this context if ($action || $oldid || $diff) return true; $ns = $title->getNamespace(); if (!Namespace::isTalk($ns) && Namespace::canTalk($ns) && $title->exists() && ( !$wgTalkHereNamespaces || in_array($ns, $wgTalkHereNamespaces) ) ) { $tns = Namespace::getTalk($ns); $talk = Title::makeTitle($tns, $title->getDBKey()); if ($talk && $talk->userCan('read')) { $t = clone $title; $t->noTalkHere = true; //Stop recursion $a = MediaWiki::articleFromTitle( $t ); $article = new TalkHereArticle( $a, $talk ); } } return true; }
Ошибка вызывается в
If (!Namespace::isTalk($ns)
заявление. Эта ошибка для меня новая. Как я могу это решить?
Я изменил код нарушения:
if ( !Ns::isTalk($ns) && Ns::canTalk($ns) && $title->exists() && ( !$wgTalkHereNamespaces || in_array($ns, $wgTalkHereNamespaces) ) ) { $tns = Ns::getTalk($ns); $talk = Title::makeTitle($tns, $title->getDBKey()); if ($talk && $talk->userCan('read')) { $t = clone $title; $t->noTalkHere = true; //Stop recursion $a = MediaWiki::articleFromTitle( $t ); $article = new TalkHereArticle( $a, $talk ); } } return true;
Было бы достаточно исправить ошибку, по крайней мере, в этом файле?
Похоже, ваш новый сервер работает под управлением PHP 5.3, а ваш старый работает с более ранней версией.
В PHP 5.3 namespace
является ключевым словом, благодаря новой функции пространства имен .
Ваш существующий класс Namespace
нужно будет переименовать. Ошибка синтаксического анализа возникает, когда код пытается разрешить Namespace::isTalk()
в имя пространства имен. (Синтаксис для этого был бы чем-то похожим на namespace Foo
, он становится путаным при просмотре оператора. Разрешения).
PAAMAYIM_NEKUDOTAYIM
– это имя для ::
(это иврит для двойной кишки)
Проверьте все строки, содержащие ::
и убедитесь, что все они правильные.