php oop расширяет проблему - PullRequest
       3

php oop расширяет проблему

0 голосов
/ 02 октября 2010

У меня есть следующие классы.

class base {

    private function __construct(){
        //check if foo method exists 
        //$this->foo(); // if it exists
    }

    public static function singleton(){
        if(!isset(self::$singleton)){
            self::$singleton = new base();
        }
        return self::$singleton;
    }
}

class sub extends base{
    public function __construct() {
        parent::singleton();
    }

    public function foo(){

    }
}

, затем инициализируйте его следующим образом:

$test = new sub();

Моя проблема в том, что я хочу проверить base __construct, есть ли у субмарина foo метод.но, похоже, у этого метода нет.

Может кто-нибудь сказать мне, где я ошибся?

Ответы [ 2 ]

3 голосов
/ 02 октября 2010

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

  1. Создать экземпляр sub
  2. Конструктор sub получает экземпляр синглтона.
  3. singleton() создает экземпляр base
  4. base проверяет, содержит ли класс base метод с именем foo. Это не.

Редактировать

я получил URL, например site.com/sub/foo, поэтому вызывается sub класса, и я хочу, чтобы база проверила, не существует ли foo, тогда я нарушу код ... foo может быть любым, если он существует как метод в подклассе 1026 *

В этом случае шаблон синглтона является излишним. Вместо этого вы можете начать с базового класса фабрики, который реализует желаемый шаблон фронт-контроллера:

class factory {
  static public function go($path) {
    list($type, $action) = explode('/', $path);
    if (class_exists($type) &&   // Does the requested type/class exist?
        is_subclass_of($type, 'factory') &&  // Basic security. Make sure URL requests can't create an instance of *any* PHP class
        method_exists($type, $action))  // Check requested method/action
    {
      $o = new $type;
      $o->$action();
    }
  }
}

class sub extends factory {
  public function foo() {
    echo('To foo or not to foo that is the question.');
  }
}

factory::go('sub/foo');
3 голосов
/ 02 октября 2010

Хотя вы вызываете parent::singleton() из sub класса, но singleton() все равно создает вам экземпляр base класса (потому что вы делаете new base()), у которого нет вашего foo() метода.

Как правило, вы не должны использовать / вызывать какие-либо методы из базового класса, которые не определены в нем. Потому что это делает ваш код не чистым: что если вы реализуете какой-то другой класс, который расширяет ваш класс base, но забывает реализовать метод foo()? Вы можете получить фатальные ошибки довольно быстро ...

Если вы уверены, что этот метод foo() всегда будет реализован любым дочерним классом - вы можете определить его как абстрактный метод в базовом классе - тогда любой дочерний класс будет вынужден реализовать его. Или, по крайней мере, как пустой метод в том же базовом классе ... Таким образом, ваш код будет чистым и структурированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...