За последние 24 часа нас посетили 17614 программистов и 1626 роботов. Сейчас ищут 1132 программиста ...

Терзаю обьекты и классы. Возник блондиночный вопрос.

Тема в разделе "Вопросы от блондинок", создана пользователем Xerk, 23 окт 2007.

  1. Xerk

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

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Можно ли из одного класса вызывать методы другого класса? Если можно, то как?

    Я знаю - код бредовый, не ругайте) Просто чтоб понятнее было, примерно чего я хочу)
    PHP:
    1.  
    2. <?php
    3. class class1
    4. {
    5.  public function function1($x)
    6.  { return $x*$x; }
    7. }
    8.  
    9. class class2
    10. {
    11.  public function function2()
    12.  {$x = 2;
    13.  $y = class1->function1($x);
    14.  echo $y;}
    15. }
    16. ?>
    17.  
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Наследование или глобальные переменные в методе. Ну или сделать метод класса статическим.
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    или я что-то путаю, или
    PHP:
    1. <?php
    2. class class1
    3. {
    4.  public function function1($x)
    5.  { return $x*$x; }
    6. }
    7.  
    8. class class2
    9. {
    10.  public function function2()
    11.  {$x = 2;
    12.  $y = class1::function1($x);
    13.  echo $y;}
    14. }
    15.  
    16.  
    17. $obj = new class2();
    18. $obj->function2(); //4
    19. ?>
     
  4. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Luge в этом случае надо делать метод статическим
    Код (Text):
    1. public static function function1($x)
     
  5. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    во, точно
     
  6. Xerk

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

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Luge Статический метод в данном случае подходит, но как я понимаю он не может работать с атрибутами класса? Только с тем, что передается в качестве параметра при его вызове?


    Я несколько неправильно написал что хотел, щас тока понял... Но
    помогли сделать так, как хотел)

    Упрощенно код сейчас выглядит так:
    PHP:
    1.  
    2. <?php
    3.  class class1
    4.  {
    5.   public function function1($x)
    6.   { return $x*$x; }
    7.  }
    8.  
    9.  class class2
    10.  {
    11.   public function function2()
    12.   { global $obj1;
    13.  $x = 2;
    14.   $y = obj1->function1($x);
    15.   echo $y;}
    16.  }
    17. $obj1 = new class1();
    18. $obj2 = new class2();
    19. $obj2->function2;
    20.  ?>
    21.  

    Еще вопрос, стоит ли в классах использовать переменные переменных таким образом:

    PHP:
    1.  
    2. <?php
    3.  class class1
    4.  {
    5.   public function function1($x)
    6.   { return $x*$x; }
    7.  }
    8.  
    9.  class class2
    10.  {
    11.   public function function2($object) /*<<----*/
    12.   { global $$object;  /*<<----*/
    13.  $x = 2;
    14.   $y = $$object->function1($x); /*<<----*/
    15.   echo $y;}
    16.  }
    17.  
    18. $obj1 = new class1();
    19. $obj2 = new class2('obj1'); /*<<----*/
    20. $obj2->function2;
    21.  ?>
    22.  
     
  7. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Наследование не катит?
    PHP:
    1. <?php
    2. class class2 extends class1 {
    3.     public function function2() {
    4.         $x = 2;
    5.         $y = $this->function1($x);
    6.         echo $y;
    7.     }
    8. }
     
  8. Xerk

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

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Нет, наследование не подходит. Об этом в первую очередь подумал.
    Просто мне важны значения атрибутов у конкретного экземпляра.
     
  9. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Нет. Очень не красиво.
    можно сделать объект1 членом класса объекта2 или передавать его параметром в функцию

    PHP:
    1. <?
    2. $obj1 = new class1;
    3. $obj2 = new class2;
    4. $obj2->obj1 = $obj1;
    5. $obj2->function2();
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
  11. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Код (Text):
    1. $obj1= new Class1; // Class1 extends Object
    2. $obj2= new Class2; // Class2 extends Object
    3. $obj1->func1( 1, 2, 3 ); // вызывает func1 из объекта $obj1 в контексте объекта $obj1
    4. $obj1->apply( $obj2, 'func1', array( 1, 2, 3 ) );  // вызывает func1 из объекта $obj1 в контексте объекта $obj2
    5. $obj2->delegates[]= $obj1; // если у $obj2 не найдётся какого-то метода - будет использован метод от $obj1, но в контексте  $obj2
    6. $obj2->func1( 1, 2, 3 );  // вызывает func1 из объекта $obj1 в контексте объекта $obj2
    методы в каждом таком объекте должны использовать вместо $this поле $this->context, тогда этот метод можно будет вызывать в контексте другого объекта, как если бы этот метод был для него определён в таком же виде.
     
  12. Xerk

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

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    Как после этого обращаться к его методам?
    Минус этого примера - обьект1 передается неявным вызовом __set, значение при этом передается не по ссылке а копируется. Перед каждым вызовом функции передавать снова - думаю это не выход.

    dark-demon, что-то весьма интересное, но без поллитры пока понять не могу - побёг за пивом :) Ща буду вникать.


    Есть еще такой вопрос: можно ли как-то имя переменной загнать в качестве значения для другой переменной?
     
  13. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    в php5 объекты всегда передаються по ссылке. Кроме того, в нем ничего никогда без нужды не копируеца

    PHP:
    1. <?
    2. class class1 {
    3.    function1() {
    4.    }
    5. }
    6.  
    7.  
    8. class class2 {
    9.    public $obj1;
    10.    function2() {
    11.       $this->obj2->function1();
    12.    }
    13. }
    14.  
    15.  
    16. $obj1 = new class1;
    17. $obj2 = new class2;
    18. $obj2->obj1 = $obj1;
    19. $obj2->function2();
    PHP:
    1. <?
    2. $var = 1;
    3. $varName = 'var';
    4. echo $$varName; // 1
     
  14. Xerk

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

    С нами с:
    5 окт 2007
    Сообщения:
    177
    Симпатии:
    0
    Адрес:
    Владивосток
    то что ты показал, я использовал выше.
    Я спрашивал, можно ли сделать это в обратном порядке. Как я это себе представлял, понять не могу :) Щас проснулся окончательно, подумал и понял, что просто написал ересь какую-то...


    А обычные переменные по ссылке передать можно?

    $obj2->var = &$var; к примеру...
     
  15. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Можно. http://php.net/references
    Нельзя ИМХО.
     
  16. Anonymous

    Anonymous Guest

    угу. однако сказанное - клинический пример для геттеров/сеттеров )