Могут ли основные классы обращаться к методам дочерних классов - PullRequest
1 голос
/ 27 января 2011

Если у меня есть:

class main {
   //hello
}

class child1 {
    function love($v) {
    }
}

class child1 {
    function hate($v) {
    }
}

function __autoload($file) {
    include_once($file . '.php');
}

Есть ли способ, которым я могу настроить это, чтобы я мог сделать

$main = new main();
$main->hate();
$main->love();

и еще

  • сохранить их как отдельные классы, а
  • использовать автозагрузчик для дочерних классов?

    Я думаю , даже если дочерние классы extend основной класс, что я не могу получить доступ к дочерним методам из родительского класса. Это верно? Если так, есть ли что-то вроде обратного extends, который вводит свойства / методы дочернего класса в основной класс?

<ч />

Обновление 1

Хорошо, похоже, что в php нет ничего встроенного, чтобы добиться этого (спасибо всем за ответы). Как насчет того, чтобы я записал свою цель, и, может быть, вы или кто-то из ваших знакомых может предложить способ добиться этого?

Я хотел бы иметь один основной класс. Затем у меня есть набор подклассов, которые работают как библиотеки сгруппированных функций. Каждый из этих подклассов __autoload редактируется, когда это необходимо для достижения цели. Например, у меня есть подкласс функций загрузки и обработки файлов, подкласс функций взаимодействия с базой данных, подкласс функций обработки xml и так далее.

Я хочу использовать это так: вызывать основной класс в начале каждого скрипта $main = new main();. Затем, позже, необходим метод обработки изображений из дочернего класса (который не был загружен), поэтому я вызываю $main->methodFromChildClass();, что приведет к автоматической загрузке этого дочернего класса и используемого метода.

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

Ответы [ 5 ]

3 голосов
/ 27 января 2011

Не существует такой языковой конструкции (во всяком случае, не в PHP - другие языки предлагают такие механизмы, как миксины, которые работают подобным образом), но есть метод, позволяющий сделать нечто подобное, называемое инверсией управления.

class Main {
  public $child;

  public function __construct($child) {
    $this->child = $child;
  }

}

$main = new Main(
  new Child1()
);

$main->child->love();

Это очень упрощенный пример, который не показывает весь потенциал этой техники. Для получения дополнительной информации ищите «инверсия управления» и «шаблоны проектирования»

1 голос
/ 27 января 2011

Я думаю, что вы заинтересованы в том, что он называется traits, который недоступен в текущей версии PHP, но будет в следующей версии и доступен в транке, если вы проверите исходный код из SVN и скомпилируете сами.

Для получения дополнительной информации см. http://wiki.php.net/rfc/traits

0 голосов
/ 27 января 2011

Вы можете использовать магию для симуляции этого поведения, но «чистый» - это нечто другое

class main {
  public function __call ($name, $args) {
    switch ($name) {
      case 'hate':
        $x = new child1;
        return $x->hate();
        break;
      case 'love':
        $x = new child2;
        return $x->hate();
        break;
    }
  }
}
0 голосов
/ 27 января 2011

С кодом, который вы дали, это не сработает.

Если child1 расширяет main, вы можете вызвать метод hate (), только создав экземпляр из класса child1 или введя метод hate ()основной () класс.Дочерние классы наследуют методы от классов Матери, но обратное неверно.

Что именно вы пытаетесь сделать?

0 голосов
/ 27 января 2011

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

Полагаю, если вына самом деле, вы могли бы сохранить объект дочернего класса внутри объекта основного класса и сделать что-то вроде $main->child->hate();, но это было бы своего рода рекурсивно, потому что если дочерний объект расширяет родительский класс, и если дочерний элемент был создан и сохраненродительской конструкции, то вы получите бесконечный цикл родительского элемента, создающего дочерний элемент, который создает нового родительского элемента внутри него, который создает нового дочернего элемента, который создает новый родительский элемент до бесконечности.Хотя вы можете обойти это, просто имея метод, который нужно будет вызывать вручную, чтобы создать и сохранить дочерний элемент.

...