Конструктор класса

udodirc

Новичок
Здраствуйте, вот проблема. Есть два класса допустим А и B. В конструкторе класса А я создаю экземпляр класса B,
в классе B создаю экземпляр класса А, получаются как бы перекрестные ссылки. Не работает, интерпретатор не компилирует. Так вот вопрос как мне сделать так, чтобы я мог вызывать методы и свойства обоих классов, в каждом классе? Можно сделать основной класс, допустим класс С в его конструкторе прописать экземплярв обоих классов, и наследовать его. Но это промежуточный класс, типа прокладки, можно ли обойтись без него?
 

Redjik

Джедай-мастер
А нахера тогда два класса - если они все друг о друге знают, тут надо
или один
или сразу штук 5 - для хохмы
 

udodirc

Новичок
А нахера тогда два класса - если они все друг о друге знают, тут надо
или один
или сразу штук 5 - для хохмы
Тут такая ситуация в классе А есть методы и свойства, которые используются в классе B, так же в классе B есть методы и свойства, которые используются в классе А. Да правильно запихать в один класс и нет проблем, но страдает логика. Допустим один класс отвечает за меню, другой за контент, зачем мне метод который связан с меню запихивать в класс контента, нарушается логика.
 

Redjik

Джедай-мастер
Так можно еще класс для футера, левого меню, онлайн консультанта, ява скриптов, правого меню...

ООП - это не просто this и стрелочка
 

Sufir

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

udodirc

Новичок
Так, а зачем футеру знать о контенте и наоборот?
Допустим есть метод get_menu_arr() в классе Menu и мне надо его вызвать в классе Content в методе get_content(), а в классе Content есть метод show_content_by_id() и его надо вызвать в классе Menu в методе show_menu(). Но у этих классов есть ссылки друг на друга в конструкторе.
 

Ярослав

Новичок
PHP:
class Content
{
    /**
     * @var Menu
     */
    protected $_menu;
    
    public function setMenu(Menu $menu)
    {
        $this->_menu = $menu;
        return $this;
    }
    
    /**
     * Create new menu instance if does not exists
     *
     * @return Menu
     */
    public function getMenu()
    {
        if (null === $this->_menu) {
            $this->_menu = new Menu($this);
        }
        
        return $this->_menu;
    }
}

class Menu
{
    /**
     * @var Content
     */
    protected $_content;
    
    public function __construct(Content $content)
    {
        $this->_content = $content;
    }
}
 

radioheaded

PHP нуб
Допустим есть метод get_menu_arr() в классе Menu и мне надо его вызвать в классе Content в методе get_content(), а в классе Content есть метод show_content_by_id() и его надо вызвать в классе Menu в методе show_menu().
Плохая логика. Определитесь с иерархией вашего приложения. Если меню у вас является контентом, то унаследуйте меню от контента и переопределите get_content. Не нужно плодить сотни разных методов, которые делают по сути одно и то же. Ключевое слово для вас — наследование.
 

melo

однажды
Не работает, интерпретатор не компилирует.
Язык php - интерпретируемый, в нем нет компилятора, поэтому интерпретатор - интерпретируют. Но существует список альтернативных компиляторов, которые php код, генерируют на другом языке и после компилируют. Со списком компиляторов, можно ознакомиться тут.

По вашему вопросу: Разберитесь, что вам надо. Вы можете, как передавать один объект в другой, так и использовать наследование.
 

udodirc

Новичок
Плохая логика. Определитесь с иерархией вашего приложения. Если меню у вас является контентом, то унаследуйте меню от контента и переопределите get_content. Не нужно плодить сотни разных методов, которые делают по сути одно и то же. Ключевое слово для вас — наследование.
Я так и сделаю, просто буду наследовать. Интересно, а сколько классов можно наследовать друг за другом?
 

udodirc

Новичок
Язык php - интерпретируемый, в нем нет компилятора, поэтому интерпретатор - интерпретируют. Но существует список альтернативных компиляторов, которые php код, генерируют на другом языке и после компилируют. Со списком компиляторов, можно ознакомиться тут.

По вашему вопросу: Разберитесь, что вам надо. Вы можете, как передавать один объект в другой, так и использовать наследование.
Насчет интерпретатора ошибся.
 
Сверху