Syntaxerrors, unerwartete ‘class’ (T_CLASS) in Zeile 1 nach dem Upgrade auf PHP 5.6.4

Nach dem Upgrade auf PHP 5.6.4 verursacht meine Widget-Datei:

Parse error: syntax error, unexpected 'class' (T_CLASS) in /home/path/fss-widgets.php on line 1

Ich bin verwirrt – mehrere Stunden Forschung hat nichts ergeben. Das Problem scheint nicht zu zitieren, zu entkommen oder irgendetwas anderes, was Sie in dieser Situation erwarten würden, und der Code sieht für mich in Ordnung aus.

  'FSSVacancyWidget', 'description' => 'Displays Recent FSS Jobs on the homepage and all other pages' ); $this->WP_Widget('FSSVacancyWidget', 'FSS Vacancies', $widget_ops); } function form($instance) { $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) ); $title = $instance['title']; $fss_numposts = $instance['fss_numposts']; $fss_vacurl = $instance['fss_vacurl']; $fss_morevac = $instance['fss_morevac']; ?> 

<label for="get_field_id('title'); ?>">Title: <input class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />

<label for="get_field_id('fss_numposts'); ?>">Number of Posts (Default is 10): <input class="widefat" id="get_field_id('fss_numposts'); ?>" name="get_field_name('fss_numposts'); ?>" type="text" value="" />

<label for="get_field_id('fss_vacurl'); ?>">Vacancy URL: <input class="widefat" id="get_field_id('fss_vacurl'); ?>" name="get_field_name('fss_vacurl'); ?>" type="text" value="" />

<label for="get_field_id('fss_morevac'); ?>">More Vacancies Title: <input class="widefat" id="get_field_id('fss_morevac'); ?>" name="get_field_name('fss_morevac'); ?>" type="text" value="" />

<?php } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = $new_instance['title']; $instance['fss_numposts'] = $new_instance['fss_numposts']; $instance['fss_vacurl'] = $new_instance['fss_vacurl']; $instance['fss_morevac'] = $new_instance['fss_morevac']; return $instance; } function widget($args, $instance) { extract($args, EXTR_SKIP); /* User-selected settings. */ $fss_numposts = $instance['fss_numposts']; $fss_vacurl = $instance['fss_vacurl']; $fss_morevac = $instance['fss_morevac']; echo $before_widget; $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']); if (!empty($title)) echo $before_title . $title . $after_title;; echo ""; echo"".$fss_morevac.""; echo $after_widget; } } add_action( 'widgets_init', create_function('', 'return register_widget("FSSVacancyWidget");') );

Solutions Collecting From Web of "Syntaxerrors, unerwartete ‘class’ (T_CLASS) in Zeile 1 nach dem Upgrade auf PHP 5.6.4"

Ein Fehler über etwas in Zeile 1 , das sich tatsächlich auf einer späteren Position befindet, bedeutet, dass PHP Ihre Zeilenenden nicht erkennt.

Es gibt drei Möglichkeiten, eine Zeilenendung zu codieren, und PHP versteht nur zwei davon:

  1. LF, oder \n , Zeilenvorschub , U + 000A
  2. CR, oder Wagenrücklauf , U + 000D
  3. CRLF oder \r\n , die Kombination der ersten und der zweiten

LF ist die Standardeinstellung für Systeme wie UNIX, Linux und Mac OS X (seit 2001).
CRLF ist der Standard in Windows, geerbt von CP / M. Just LF funktioniert heutzutage auch unter Windows, CRLF muss nicht mehr verwendet werden.
CR war der Standard in Classic Mac OS bis 2001.

PHP versteht nicht 2., nur CR, was verständlich ist, weil das niemand mehr benutzt. Nun, fast niemand. Es gibt immer noch einige Redakteure, die nicht nur diese veraltete Zeilenende-Kodierung erlauben, sie warnen sogar ihre Benutzer, wenn sie sie benutzen.

Richten Sie Ihren Editor so ein, dass nur LF verwendet wird, und Sie sind in Sicherheit. Leider schweigen die WordPress Coding Standards dazu.

@ Tosho’s Antwort ist zu gut.

Was gerade passiert ist, ist PHP Parser versucht, diese Datei zu analysieren und erstellt Token zuerst, und wird mit der ersten Tokenklasse verwechselt, weil der Parser für diese Version von PHP kann nicht gut mit \r Zeichen arbeiten.

Es passiert, dass auch andere unsichtbare Unicode-Zeichen den Parser beschädigen können. Die Hauptsache, Sie können das Problem vom Editor nur nicht verstehen, wenn Sie den Hex-Editor öffnen.

BOM Charakter auch (Requisiten @ MarkKaplun) kann Probleme machen. Es gibt einige Unicode-n-Gedankenstrich-Zeichen, die wie - (minus) aussehen können, und Sie können sich tagelang den Kopf kratzen.

In diesem Fall, wie Sie \r Carriage Return-Zeichen bestätigt haben, war Ihr Problem.

Dies hängt jedoch von der PHP-Version ab. Ich habe Ihren Code auf PHP 7 getestet und kein Problem gefunden.

Ich habe bemerkt, dass der WPSO-Editor das Zeichen abschneiden wird, und ich habe es beim Testen manuell hinzugefügt.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Die Moral der Geschichte.

Fix die Zeilenenden aus Ihrem Editor, für Ihr Projekt über Regex ersetzen.

Behebt aber auch Endungen für Nicht-PHP-Dateien.

 define('CR', "\r"); // Carriage Return: Classic Mac define('CRLF', "\r\n"); // Carriage Return and Line Feed: Windows define('LF', "\n"); // Best: Unix, Linux, Mac, Windows function fix_endings($s) { // Convert all line-endings to the Best format. $s = str_replace( CRLF, LF, $s ); $s = str_replace( CR, LF, $s ); // Don't allow out-of-control blank lines $s = preg_replace( "/\n{2,}/", LF . LF, $s ); return $s; } 

Die Zeilenenden sind sehr wichtig und können auch Auswirkungen auf die Sicherheit haben. Wenn der PHP-Parser bei einigen Zeichen fehlschlägt, können Sie auch einige PHP-functionen erraten, die Dateien lesen.