2012-02-05 3 views
1

У меня есть родительский класс, допустим, class main { ... } и его расширение, назовем его class extension extends main { ... }.Как создать класс PHP?

Мой вопрос, как я бы построить еще один класс, называемый class messages { ... }, который я могу использовать внутри main класса и расширенного класса main, extension? Кроме того, как я знаю, называя класс messages так:

$messages = new messages; 
$messages->someMethod(); 

Есть еще один способ без необходимости делать new ... сделать main и extension класса наследуют методы внутри messages класса?

+1

Я не уверен, что вы ищете 'virtual' или' static' метод? Взгляните на руководство http://php.net/manual/en/language.oop5.static.php – Vyktor

ответ

3

AFAIK, PHP не поддерживает несколько inheritan ce, как и другие языки ООП.

Итак, нет, нет другого способа.

И да, вы должны создать свойство и инициализировать объект внутри класса main ...

class main { 
    public $messages; // may be "protected" or "private" instead 

    public __construct() 
    { 
     $this->messages = new messages(); 
    } 

    public do_something() 
    { 
     $this->messages->do_something_else(); 
    } 
} 

Однако, есть альтернативы имитироватьподдельные множественного наследования.

Альтернативой будет: https://stackoverflow.com/a/356431/370290 - Но я не рекомендую это (даже собственный автор этого не делает).

Другая альтернатива: https://stackoverflow.com/a/358562/370290 - ИМХО, как странно, как предыдущий. :-)

И, как PHP 5.4.0 вы также можете использовать черты для достижения эффекта «множественного наследования»: http://php.net/manual/en/language.oop5.traits.php - Это очень новый на данный момент.

+0

Итак, вы предлагаете инициировать класс 'messages' внутри метода' _construct' и связывать методы из 'сообщений 'class в переменную' public $ messages'? Это означало бы, что я могу вызывать любой метод из класса 'messages' всякий раз, когда мне нужно просто' $ this-> messages-> do_something_else(); '. Это хорошая идея, как предположил и @Nanne. Потому что я уже использую метод '_construct' для установления связи с db. – Roland

+0

@ Роланд: да, да. Это был бы простой, прямой, эффективный и нормальный способ сделать это. Другие подходы служат только тогда, когда вам отчаянно нужен другой материал. Вот как я понимаю эту тему. BTW, техническое название для этого - ** состав ** - см. Http://stackoverflow.com/a/477198/370290 –

+0

Может быть ** черта ** была бы способ пойти, но она слишком недавняя. (Я еще не использовал его сам.) Стабильная версия PHP 5.4.0 даже не была выпущена в настоящий момент. –

1

Проблема, которая, как вам кажется, заключается в том, что вы не можете выполнять множественное наследование (class YourClass extends main, messages).

Общее ощущение, что если вам нужно многократное наследование, вы делаете что-то не так в своем дизайне.

Каждый класс несет ответственность за единственную вещь. «Расширение» в этом случае «IS A» «main», но это не «сообщения», поэтому он не должен быть ребенком этого. ЕСЛИ вам нужна возможность обмена сообщениями, нет никакого «стыда» вообще, просто называя его, как вы предлагаете: вы получаете себе хороший объект, который знает, как общаться, и играть с этим. Нет реальной необходимости делать это по-другому.

Если вы ищете альтернативы (которые вам действительно не нужны, насколько я могу видеть!), Вы можете сделать это классом с кучей статических методов и просто называть его messages::someMethod(), но я думаю что в этом случае будет рассматриваться как анти-шаблон.

Просто пойдите с ним: сообщения создаются объектом типа message. Итак, вы делаете это и вызываете функцию. В конце концов, если вам понадобятся большие изменения (подключение к базе данных, ведение журнала и т. Д.) Для обмена сообщениями, вы можете сделать все это в своем приятном и уютном классе сообщений. Все счастливы :)

0

Вы должны создать класс внутри класса. Как и в этом question.

Затем вы можете использовать $this->someclass->function.

Примечание: конструкция должна быть $this->someclass = new Whatever().

1

Вы не можете расширить несколько классов и расширить основной класс .. только хорошо, если вы простираетесь от абстрактного класса.

Но то, что вы могли бы сделать, это добавить его в конструкции вашего основного класса, как это:

//member variable for class main 
public $_message = null; 

public function __construct() 
{ 
    $this->_message = new Message(); 
} 

Затем, когда вам нужно класс сообщений просто вызовите $this->_message + метод вам нужно (например: $this->_message->addMessage())

не забудьте добавить это в вас подклассы:

public function __construct() 
{ 
    parent::__construct(); 
}