PHP用常量连接变量

时间:2016-02-17 18:15:48

标签: php static constants

我有一个静态3: 5 26: 4 22: 4 16: 3 20: 3 11: 2 1: 2 7: 1 类,它从另一个类传递一个字符串。当字符串作为变量传递时,它可以工作。当我将其更改为常量时,错误为:

  

[2016年2月17日19:08:48欧洲/柏林] PHP警告:include():失败   开盘   ' /应用程序/ MAMP / htdocs中/ its_vegan /脚本/ back_end /视图/模板'   包括在内   (include_path ='。:/ Applications / MAMP / bin / php / php7.0.0 / lib / php')in   /Applications/MAMP/htdocs/its_vegan/scripts/back_end/views/view.php on   第23行

View

在CountrySelect中做了什么工作:

class View {

    /**
     * -------------------------------------
     * Render a Template.
     * -------------------------------------
     * 
     * @param $filePath - include path to the template.
     * @param null $viewData - any data to be used within the template.
     * @return string - 
     * 
     */
    public static function render( $filePath, $viewData = null ) {

        // Was any data sent through?
        ( $viewData ) ? extract( $viewData ) : null;

        ob_start();
        include ( $filePath );// error on this line
        $template = ob_get_contents();
        ob_end_clean();

        return $template;
    }
}

class CountrySelect {

    const template = 'select_template.php'; //the const is template

    public static function display() {

        if ( class_exists( 'View' ) ) {

            // Get the full path to the template file.

            $templatePath = dirname( __FILE__ ) . '/' . template; //the const is template

            $viewData = array(
                "options" => '_countries',
                "optionsText" => 'name',
                "optionsValue" => 'geonameId',
                "value" => 'selectedCountry',
                "caption" => 'Country'
            );

            // Return the rendered HTML
            return View::render( $templatePath, $viewData );

        }
        else {
            return "You are trying to render a template, but we can't find the View Class";
        }
    }
}

为什么模板必须是静态的?我可以把它变成静态常数吗?

2 个答案:

答案 0 :(得分:3)

您也可以使用self::template
由于类常量是按类级而不是每个对象定义的,因此static::template将引用相同的内容,除非您有子类。 (见https://secure.php.net/manual/en/language.oop5.late-static-bindings.php

template指的是全局常量(例如define('template', 'value');

答案 1 :(得分:2)

在这一行

$templatePath = dirname( __FILE__ ) . '/' . template; 

template不是常数,因为在类中声明了常量template。此代码的工作原理类似

$templatePath = dirname( __FILE__ ) . '/template'; 

所以,请使用static::template