2016-11-03 3 views
1

Я работаю с PHP и несколькими языками ООП и все еще задаюсь вопросом о значении шаблона проектирования и ООП на PHP и подобных языках.Дизайн шаблона и ООП в PHP?

У меня есть некоторые модули в моем проекте: новости, форум ... Каждый модуль может получить доступ, называя его основным классом.

  • Главный класс маршрутизации страницы ~> указывает на новости/статьи, новости/категории.
  • Имейте некоторые настройки/переменные модуля.

И дочерние классы в каждом модуле обрабатывают эти конкретные функции/страницы.

Каков наилучший шаблон для этой модели? Создать экземпляр класса или его дочернего элемента?

Теперь я инициализирую класс и получаю доступ к статическим методам дочернего класса, подобным приведенному ниже примеру. Но я прочитал, используя статический метод, может замедлить код?

class news { 
    __construct() { 
    // define module settings 
    ... 
    // routing all module pages 
    categories::list(); 
    } 
    function modulesetting() {} 
} 
class categories extends news { 
    static function list() {} 
} 
+0

Использование статического метода немного медленнее, чем экземпляр класса, но с другой стороны, статический метод сохраняет память. я вижу, что ваш дочерний класс 'categories' наследует класс' news', поэтому вам не нужен экземпляр класса 'news', потому что экземпляр' inherit метода наследования 'и т. д. – Kazz

+0

вы можете перезаписать метод' list' и 'modulesetting' для каждый дочерний класс, есть способы вызвать родительские методы из перезаписываемых методов, таких как «parent :: list();» или «parent :: modulesettings();», и еще один пример: вы можете, например, сделать что-то подобное в 'news -> __ construct': 'if ($ this instanceof categories) {...}' – Kazz

+0

, если вы создаете абстрактный базовый класс для всех основных классов, которые обрабатывают маршрутизацию, и добавьте фундаментальный контроль для всех детей лучшим способом, на мой взгляд, – Kazz

ответ

0

Просто для галочки, что я имею в виду (успокойтесь):

структура папок:

/index.php 
/autoload.php 
/IModule.php 
/IPage.php 
/BaseModule.php 
/modules/ 
/modules/News.php 
/modules/News/ 
/modules/News/Categories.php 
/modules/News/Acticle.php 
... 

index.php

require_once('./autoload.php'); 

// based on request select which module to use 
$moduleName = 'News'; 
$page = ('module\\'.$moduleName)::route(); 
$page->render(); 

autoload.php

function __autoload($classname) { 
    $filename = __DIR__ . '/'. $classname . '.php'; 
    include_once($filename); 
} 

IModule.php

interface IModule { 
    public static function route(); 
    //protected function moduleSettings(); 
} 

IPage.php

interface IPage { 
    public function render(); 
} 

BaseModule.php

abstract class BaseModule implements \IModule { 
    // fundamental stuff 
} 

news.php

namespace modules; 

class News extends \BaseModule { 
    protected $someProperty; 

    __construct() { 
     // define module settings 
    } 

    public static function route(){ 
     // routing all module pages, based on request   
     $page = 'modules\News\Categories'; 
     return new $page; 
    } 

    protected function moduleSettings(){ ... } 
} 

categories.php

namespace modules\News; 

class Categories extends \module\News implements \IPage { 

    public function render() { 
     /* access to module news */ 
     $this->someProperty; 
     $this->moduleSettings(); /* or if method moduleSettings is overwriten then */ parent::moduleSettings(); 
     /* for example */ 
     echo '<html></html>'; 
    } 

} 
Смежные вопросы