2014-02-15 3 views
0

Это очень простой архитектурный вопрос, и поэтому он очень гипотетический.Перехват метода, основанный на условии, проверенном родительским классом

Представьте себе эту простую схему:

У меня есть класс, представляющий веб-объект, только один метод, который делает объект. Однако этот класс расширяет родительский класс, который требует выполнения определенных условий, так что метод фактически выполняется (так что объект визуализируется).

Пример

class webObject__adminBase { 

    protected function shouldRender(){ 
     return access::isAdmin(); 
    } 

} 

class webObject__adminPanel extends webObject__adminBase { 

    public function invoke(){ 

     if(!parent::shouldRender()) 
      return; 

     // if still here, render the object 

    }   

} 

$panel = new webObject__adminPanel(); 
$panel->invoke(); 

Код выше служит как: пример плюс практический пояснительный подход к решению проблемы.

Проблема заключается в следующем: я хотел бы обойти эту проблему, не имея необходимости вызывать метод в родительском классе в методе рендеринга ребенка.

Я хотел бы получить дизайн класса, который гарантирует, что все, что мне нужно сделать, это расширить родительский класс webObject__adminBase. Любые вызовы любых методов в моем дочернем классе должны быть проверены на определенных условиях (как в этом примере systemAccess::isAdmin()) и выполнять только при выполнении этих условий.

Надеюсь, мое описание ясное.


Поскольку кто-то на самом деле просил, чтобы закрыть этот вопрос, как «слишком широким», я решил перефразировать мой актуальный вопрос с более прямой ссылкой на название вопроса:

Есть ли способ перехвата (или даже выполнение) дочернего метода на основе условия, проверяемого его родительским классом (без вызова метода для этого родительского класса)?

+1

Существуют синтаксические ошибки, сумасшедшее соглашение об именах и не допускаемый доступ к защищенным методам.Если это пример, это плохой tbh – PeeHaa

+0

Спасибо, что указали это. Должно было быть осторожнее, набрав его. Однако я не вижу проблем с именованием. Пожалуйста, уточните, чтобы я мог улучшить. – SquareCat

+0

Ваши имена классов для одного. По большинству конвенций имена классов - это верблюжий случай. И в чем эти двойные подчеркивания. Также похоже, что вы пытаетесь использовать символы подчеркивания для классов пространства имен вместо использования фактических пространств имен. – PeeHaa

ответ

1

Вот один из способов сделать это, хотя и довольно простой. Я уверен, что есть лучшие методы, но этот пытается сохранить вашу оригинальную методологию.

https://ideone.com/D5hA3H

Рендер Class

abstract class Render 
{ 

    abstract public function main(); 

    public function __construct() 
    { 

    } 

    final public function render() 
    { 
     if (!$this->canRender()) return ''; 

     return $this->main(); 
    } 

    final public function canRender() 
    { 
     // Logic here 
     return true; 
    } 
} 

Администраторском класса

class AdminPanel extends Render 
{ 
    public function main() 
    { 
     return "Admin Panel"; 
    } 
} 

Execution

$panel = new AdminPanel(); 

echo $panel->render(); 

PeeHaa прав насчет именования, это в лучшем случае, чтобы попробовать и следовать популярному стилю кодирования, который позволяет вам самому читать код проще и наоборот. Вы можете взглянуть на стандарты PHP-FIG PSR one и two, которые помогают создавать согласованный код.

PHP The Right Way также является отличным сайтом, который поможет вам максимально использовать его, он предоставляет информацию о методах инъекции и кодирования зависимостей среди других вещей.

+0

Это выглядит довольно многообещающе. Кроме того, благодарю вас за разъяснение проблем, связанных с именованием, и за предоставление правильных ссылок, чтобы узнать больше об этих вещах. +1 – SquareCat