Как передать переменную другому классу в php

Тема в разделе "PHP", создана пользователем sashalg, 30 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Привет Всем!
    Столкнулся с такой проблемой... Необходимо передать переменную из одного класса в другой.
    Пример:

    Код:
    
    [B]class[/B] A {
      [B]public[/B] $Odin = "";
    
      [B]function[/B] test(){
        [B]echo[/B] $this->Odin;
      }
    }
    
    [B]class[/B] B {
      [B]public[/B] [COLOR="RoyalBlue"]$Dva[/COLOR] = "";
    
      [B]function[/B] prnt(){
        // здесь надо передать данные в класс A
        // переменную $this->Dva
      }
    }
    
      [COLOR="RoyalBlue"]$a[/COLOR] = [B]new[/B] A;
      [COLOR="RoyalBlue"]$b[/COLOR] = [B]new[/B] B;
    
      [COLOR="RoyalBlue"]$b->Dva[/COLOR] = [COLOR="DarkOliveGreen"]"testing"[/COLOR];
      [COLOR="RoyalBlue"]$b->prnt()[/COLOR];
      [COLOR="RoyalBlue"]$a->test()[/COLOR];
    
    
    Вот такая замануха.
     
  2. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    так что ли?
    PHP:
    class {
      public 
    $Odin "";

      function 
    test(){
        echo 
    $this->Odin;
      }
    }

    class 
    {
      public 
    $Dva "";

      function 
    prnt(){
        
    // здесь надо передать данные в класс A
        // переменную $this->Dva
        
    $GLOBAL['a']->Odin=$this->Dva;
      }
    }

      
    $a = new A;
      
    $b = new B;

      
    $b->Dva "testing";
      
    $b->prnt();
      
    $a->test();
     
  3. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    В том то и дело, что $a - нельзя заранее предугадать, то есть класс B не может изначально знать с каким именем будет объект класса A. Соответственно $GLOBAL['a']->Odin=$this->Dva; не применимо. Но наверное есть же другое решение?
     
  4. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    А почему бы не делать так:
    PHP:
    $a = new A;
    $b = new B;
    $b->Dva "testing";
    $a->Odin $b->Dva;
    ?
     
  5. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Такое решение конечно простое... НО!
    При множестве классов возникает необходимость передачи переменных из класса в класс не используя такой метод...

    Добавлено через 7 минут
    Даже пробовал так:

    Код:
    [B]class[/B] A {
      [B]static public[/B] $Odin = "";
    
      [B]function[/B] test(){
        echo self::$Odin;
      }
    }
    
    [B]class[/B] B {
      [B]public[/B] $Dva = "";
    
      [B]function[/B] prnt(){
         A::$Odin = $this->Dva;
      }
    }
    
      $b = [B]new[/B] B;
      $b->Dva = "testing";
      $b->prnt();
    
      $a = [B]new[/B] A;
      $a->test();
    
    Но тут проблема... После инициализации класса A я могу повлиять только на все переменные объекты класса A...
     
  6. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    а если классу б пердать ссылку на экземпляр а?
    PHP:
    <?php
    class {
      public 
    $Odin "";

      function 
    test(){
        echo 
    $this->Odin;
      }
    }

    class 
    {
      public 
    $Dva "";


      function 
    prnt(){
        
    $this->a->Odin $this->Dva;
        
    // здесь надо передать данные в класс A
        // переменную $this->Dva
      
    }
    }

      
    $a = new A;
      
    $b = new B;
      
    $b->=& $a;

      
    $b->Dva "testing";
      
    $b->prnt();
      
    $a->test();
    ?>
     
  7. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Это будет по сути тоже, что и
    Код:
    $a->Odin = $b->Dva;
    Блин... Уже голова болит...

    Остаётся только два варианта:
    1. Использовать static и мирится с его глобальными изменениями.
    2. Передавать вручную типа $a->Odin = $b->Dva; или $b->a =& $a;

    Ндааа... Не утешительно... :confused:
     
  8. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    не совсем одно и тоже
    $a->Odin = $b->Dva; или $b->a =& $a;
    во втором случае передача переменной осуществляется внутри класса
    и передавать можно сколько угодно переменных и где угодно в программе
    достаточно вызвать $b->prnt();


    а статические и суперглобальные перменные это неправильно, противовечит принципам ООП.
    За это на лабах по С++ по башке давали :)
     
  9. sashalg

    sashalg Читатель

    Заблокирован
    Регистр.:
    21 мар 2008
    Сообщения:
    49
    Симпатии:
    7
    Я тут поковырял твоё предложение... и соглашусь с тобой... На данный момент это намного лучший вариант.

    Это я в курсе... Я и сам на C++ писал. Именно по этой причине не хочу использовать статические методы.

    Добавлено через 8 минут
    Просто объясню подробней, что я хочу:

    PHP:
      class {
        static public 
    $Odin;

        function 
    test(){
          echo 
    self::$Odin;
        }
      }

      class 
    {
        public 
    $Dva;

        function 
    prnt(){
          
    A::$Odin $this->Dva;
        }
      }


      class 
    {

        function 
    add_obj($name$class_name){
          eval(
    '$this->'.$name.' = new '.$class_name.'();');
        }
      }

      
    $c = new C;
      
    $c->add_obj('a','A');
      
    $c->add_obj('b','B');
    Вот... а теперь хочу заставить их (классы $a и $b) обмениваться между собой данными.
    Например, если я вызываю какуюто функцию класса $b и она, понятное дело, что-то делает, должно отразится на обеих классах.
     
  10. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    а что мешает создать классах методы обмена и в них помещать данные?.. или создать третий для обмена и от него наследовать А и В..
     
Статус темы:
Закрыта.