За последние 24 часа нас посетили 25084 программиста и 2021 робот. Сейчас ищут 898 программистов ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем udodirc, 6 июн 2012.

  1. udodirc

    udodirc Активный пользователь

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

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    покажи код
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ничего не понятно.
    Сами поняли, что сказали?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да понятно вполне. =) такое бывает. Классовая рекурсия :D
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вместо того, чтобы делать
    Код (PHP):
    1. class A {
    2.     private $B;
    3.     function __construct() {
    4.         $this->B = new B;
    5.     }
    6. }
    7. class B {
    8.     private $A;
    9.     function __construct() {
    10.         $this->A = new A;
    11.     }
    12. }
    13.  
    надо делать
    Код (PHP):
    1. class A {
    2.     private $B;
    3.     function __construct() {
    4.         $this->B = new B($this);
    5.     }
    6. }
    7. class B {
    8.     private $A;
    9.     function __construct($A) {
    10.         $this->A = $A;
    11.     }
    12. }
    13.  
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    (
    php не строгий язык ему не важно что пишем =)
    Так, что лучше наверное будет так тогда делать.
    Код (PHP):
    1. class p {
    2.     public static function p1() {
    3.         return'p1';
    4.     }
    5. }
    6. class a extends p {
    7.     public static function p1() {
    8.         return p::p1().' - a:p1()';
    9.     }
    10.     public static function a1() {
    11.         return'a1';
    12.     }
    13.     public static function a2() {
    14.         return'a2';
    15.     }
    16.     public static function a3() {
    17.         return'a3';
    18.     }
    19.     public function ac() {
    20.         return'ac';
    21.     }
    22. }
    23. class c extends a {
    24.     public static function c1() {
    25.         return self::a1().' '.self::a2().' '.self::a3().' '.self::p1().' '.c::o()->r();
    26.     }
    27.     public static function o() {
    28.         return new c();
    29.     }
    30.     public function r() {
    31.         return'r';
    32.     }
    33. }
    34. echo nl2br(c::c1().'
    35. '.c::a2().'
    36. '.c::a3().'
    37. '.c::p1().' '.c::o()->r().'
    38. '.c::o()->ac()); 
    a1 a2 a3 p1 - a:p1() r
    a2
    a3
    p1 - a:p1() r
    ac
     
  7. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    В PHP нет конструктора класса. То, что вы называете конструктором (__construct) - на самом деле инициализатор.
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. class a {
    2.     public function a($a) {
    3.         
    4.     }
    5. }
    6. $a=new a('a'); 
     
  9. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Так и это инициализатор. В отличии от других языков, где конструктор вызывается, когда создается объект класса, в php метод-конструктор вызывается уже после того, как создан объект, и занимается он инициализацией.
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    хотя и тут есть ньюанс:
    Код (PHP):
    1. public function a($a) {
    2.         
    3. } 
    PHP >= 5.3.3 это уже будет обычный метод.

    Ты чем вообще читаешь материал?


    Так, что это правильно будет метод-конструктор, а не инициализатор :D
    Но используется для инициализации какого-либо состояния объекта перед его использованием.