Расширение класса PHP с помощью подклассов и создание всех функций в одном объекте

Я использую Smarty Template Engine (http://smarty.net) на сайте, но у меня есть дополнительные, настраиваемые функции для обработки задач компиляции шаблонов.

Чтобы иметь возможность обновлять файлы инфраструктуры Smarty (например, /smarty/Smarty.class.php) и не нужно копировать и вставлять мою пользовательскую функцию в класс внутри Smarty.class.php, я подумал: «эй, давайте просто сделаем мой собственный класс и расширить класс Smarty! » Тем не менее, я не могу заставить это работать и буду признателен за любые полезные советы 🙂

Вот что я получил на данный момент:

  • Web-Root /
    • включает в себя/
      • 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;

Результат и проблема

Хорошо, я надеюсь, что мои намерения ясны из приведенных выше фрагментов кода: Я хочу объект $ умник содержать также

  1. моя дополнительная, новая пользовательская функция шаблона,
  2. и моя функция замены

И потому что я используюпродолжается«для моего объявления 2 классов я думал, что это должно просто работать, используя:

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

Но, к сожалению, этого не происходит 🙁 Я МОГУ добавить свои пользовательские функции непосредственно в класс Smarty внутри Smarty.class.php — но это, очевидно, сделает файл не подлежащим обновлению.

Чего мне не хватает, используя мои 2 подкласса, расширяющие класс Smarty, и во время разговора с методами, объявленными в них? Или как бы вы подошли к расширению стороннего класса с помощью пользовательских / переписанных функций, не затрагивая оригинальный код?

Спасибо за любой совет!

2

Решение

✅ на основе этот stackoverflow-Вопрос / Ответы Я смог преодолеть свою проблему и запустить Код с моими пользовательскими классами и методами.

Решение (суммировано)

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

Если бы я все еще что-то пропустил или какие-либо рекомендации, я был бы рад услышать об этом 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]