语法错误,升级到php 5.6.4后,第1行出现意外的‘CLASS’(T_CLASS)

时间:2017-01-14 作者:toomanyairmiles

升级到php 5.6.4后,my widgets文件导致:

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

我很困惑——几个小时的研究没有取得任何成果。在这种情况下,问题似乎不是引用、转义或任何其他您期望的内容,代码在我看来还行。

<?php

/*
Plugin Name: FSS Vacancy Widget
Plugin URI: http://www.url.com/
Description: Shows recent vacancies
Author: Name
Version: 1.0
Author URI: http://www.url.com/
*/

class FSSVacancyWidget extends WP_Widget
{
  function FSSVacancyWidget()
  {
    $widget_ops = array(\'classname\' => \'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\'];
?>
    <p><label for="<?php echo $this->get_field_id(\'title\'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id(\'title\'); ?>" name="<?php echo $this->get_field_name(\'title\'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label></p>
    <p><label for="<?php echo $this->get_field_id(\'fss_numposts\'); ?>">Number of Posts (Default is 10): <input class="widefat" id="<?php echo $this->get_field_id(\'fss_numposts\'); ?>" name="<?php echo $this->get_field_name(\'fss_numposts\'); ?>" type="text" value="<?php echo attribute_escape($fss_numposts); ?>" /></label></p>
    <p><label for="<?php echo $this->get_field_id(\'fss_vacurl\'); ?>">Vacancy URL: <input class="widefat" id="<?php echo $this->get_field_id(\'fss_vacurl\'); ?>" name="<?php echo $this->get_field_name(\'fss_vacurl\'); ?>" type="text" value="<?php echo attribute_escape($fss_vacurl); ?>" /></label></p>    
    <p><label for="<?php echo $this->get_field_id(\'fss_morevac\'); ?>">More Vacancies Title: <input class="widefat" id="<?php echo $this->get_field_id(\'fss_morevac\'); ?>" name="<?php echo $this->get_field_name(\'fss_morevac\'); ?>" type="text" value="<?php echo attribute_escape($fss_morevac); ?>" /></label></p>   

<?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 "<ul class=\'items\'>";

    query_posts( array( \'showposts\' => $fss_numposts ) );
    if ( have_posts() ) : while ( have_posts() ) : the_post();
    echo "<li><a href=\'".get_permalink()."\'><span class=\'job-title\'>".get_the_title()."</span><span class=\'job-date\'>".get_the_date(\'d m Y\')."</span></a></li>";

    endwhile; endif; wp_reset_query();

    echo "</ul>";
    echo"<a href=\'".$fss_vacurl."\' class=\'view\'>".$fss_morevac."</a>";

    echo $after_widget;
  }

}
add_action( \'widgets_init\', create_function(\'\', \'return register_widget("FSSVacancyWidget");\') );

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

上的某个错误line 1 这实际上是在后面的位置,这意味着PHP无法识别您的行尾。

有三种编码行尾的方法,PHP只理解其中的两种:

左前,或\\n, 线路馈线,U+000A

  • CR,或\\r, 车厢返回,U+000D\\r\\n, 在UNIX、Linux和Mac OS X(自2001年起)等系统上,第一个和第二个LF的组合是默认值
    CRLF是Windows中的默认值,继承自CP/M. 现在,只要LF也能在Windows上工作,就没有必要再使用CRLF了
    CR是中的默认值Classic Mac OS 直到2001年。

    PHP不理解2。,仅限CR,这是可以理解的,因为没有人再使用它了。嗯,几乎没有人。还有一些编辑器不仅允许使用过时的行尾编码,甚至在用户使用时都不会警告用户。

    将编辑器设置为仅使用LF,这样您就安全了。不幸的是WordPress Coding Standards 对此保持沉默。

  • SO网友:prosti

    @tosho的回答太好了。

    刚才发生的是PHP解析器尝试解析该文件并创建tokens 首先,与第一个标记混淆class, 因为该版本的PHP的解析器无法与\\r 字符。

    其他不可见的Unicode字符也可能会破坏解析器。最主要的是,除非打开Hex编辑器,否则您无法从编辑器中理解问题。

    BOM字符(props@MarkKaplun)也会产生问题。有些Unicode n-dash字符看起来就像- (负),你可以抓你的头好几天。

    在这种情况下,正如你所确认的\\r carriage return character 是你的问题。

    但这取决于PHP版本。我在PHP 7上测试了您的代码,没有发现任何问题。

    我注意到WPSO编辑器将修剪\\r 字符,我在测试时手动添加了它。

    enter image description hereenter image description here

    这个故事的寓意。

    通过regex replace从编辑器中修复项目的行尾

    但也修复了非PHP文件的结尾。

    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;
    }
    
    行尾非常重要,也可能有安全隐患。如果PHP解析器在某些字符上失败,您可能会猜到一些读取文件的PHP函数也可能失败

    相关推荐

    无法在模板函数.php中使用IS_HOME

    我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请