Friday 11 January 2019

php - Unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting T_NS_Separator




I moved an application from an Ubuntu 11.04 (Natty Narwhal) Server to a Red Hat Enterprise Linux (RHEL) server over the weekend. My error log is full of the PHP errors in the subject line referencing the following function:



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;
}


The error is thrown in the




If (!Namespace::isTalk($ns)


statement. This error is a new one for me. How might I resolve it?



I changed the offending code to:



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;


Would that suffice to fix the error, at least in this file?


Answer



It looks like your new server is running PHP 5.3, while your old one was running an earlier version.



In PHP 5.3, namespace is a keyword, thanks to the new namespace feature.




Your existing Namespace class is going to need to be renamed. The parse error is occurring as the code tries to resolve Namespace::isTalk() into a namespace name. (The syntax for doing so would be something akin to namespace Foo; it becomes confused at seeing the :: resolution operator.)


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...