使用子类扩展PHP类并将所有函数实例化为一个对象

时间:2016-01-06 01:01:12

标签: php class inheritance smarty subclass

我在网站上使用Smarty模板引擎(http://smarty.net),但我有其他自定义函数来处理模板编译任务。

为了能够更新Smarty框架文件(例如/smarty/Smarty.class.php)而不必将我的自定义函数复制粘贴到Smarty.class.php中的类中,我想&#34嘿,让我们自己上课并扩展Smarty Class!"。但是,我无法使用此功能,并希望获得任何有启发性的建议:)

这就是我现在所得到的:

  • Web的根/
    • 包括/
      • Smarty.inc.php
    • smartylib /
      • Smarty.class.php
      • Smarty_Compiler.class.php

Smarty.class.php

我不想触摸的第三方供应商档案和课程:

class Smarty {
    // various vars declarations
    public function __construct() {
        // ...
    }

    function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null) {
        // magic...
        $smarty_compiler = new $this->compiler_class;
        // more magic...
    }

    // more class methods declarations
}

Smarty_Compiler.class.php

我不想触及的另一个第三方供应商档案和课程:

class Smarty_Compiler extends Smarty {
    // various vars and methods declarations...

    function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
        $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
    }

    // more various methods declarations...
}

Smarty.inc.php

我的自定义Smarty包含带有新子类的文件并实例化$ smarty对象:

/**
 * My extensions for the Smarty Class
 */
Class MySmarty extends Smarty {
    // different custom vars declarations

    /**
     * My ADDITIONAL custom Template Compile function
     */
    public function compile ($template, &$errors) {
        // custom code
    }
}

/**
 * My extensions for the Smarty_Compiler Class
 */
Class MySmarty_Compiler extends Smarty {
    // different custom vars declarations
    var $_manual_compiler_errors = array();

    /**
     * My REPLACEMENT _syntax_error function
     */
    public function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
        global $_manual_compiler_errors;

        if ($_manual_compiler_errors) {
            array_push($_manual_compiler_errors, "smarty syntax error on line ".$this->_current_line_no.": $error_msg");
        }else{
            $this->_trigger_fatal_error("smarty syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
        }
    }
}

// Instantiate Smarty
include_once($_SERVER['DOCUMENT_ROOT'].'/smartylib/Smarty.class.php');
$smarty = new Smarty;
$smarty->debugging = true;
$smarty->force_compile = false;

结果和问题

好的,我希望我的意图从上面的代码片段中清楚显示:我希望对象 $ smarty 也包含

  1. 我的新增自定义模板功能
  2. 和我的替代功能
  3. 因为我使用" 延伸"对于我的2级声明,我认为这应该只使用:

    $smarty->compile(...);
    $smarty->_syntax_error(...);
    

    但不幸的是它并没有:(我可以将我的自定义函数直接添加到Smarty.class.php中的Smarty类中 - 但这显然会使文件不可更新。

    通过使用扩展Smarty类的2个子类以及与其中声明的方法交谈,我错过了什么?或者如何在不使用自定义/重写函数的情况下扩展第三方类触摸原始代码?

    谢谢了解任何建议!

1 个答案:

答案 0 :(得分:0)

✅基于this stackoverflow-Question/Answers我能够克服我的问题,并使用我的自定义类和方法运行代码。

解决方案(总结)

Class MySmarty extends Smarty {
    ...
}

Class MySmarty_Compiler extends Smarty {
    function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
        ...
    }
}

// Instantiate Smarty the new way
include_once($_SERVER['DOCUMENT_ROOT'].'/smartylib/Smarty.class.php');
$smarty = new MySmarty; // Instantiate my Subclass, it loads the Main Class too
$smarty_compiler = new MySmarty_Compiler; // Overwrite the $smarty_compiler Object with my second patched Subclass, which loads the Smarty_Compile Class too

如果我仍然遗漏某些内容或任何建议,我会很高兴听到它:)