За последние 24 часа нас посетили 18848 программистов и 1729 роботов. Сейчас ищут 1060 программистов ...

Обращение напрямую к методам объекта внутри другого объекта?

Тема в разделе "Прочие вопросы по PHP", создана пользователем bobroff, 25 янв 2010.

  1. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Здравствуйте

    К примеру есть следующие классы:
    PHP:
    1.  
    2. class Apple
    3. {
    4.    $Grape = new Grape();
    5.  
    6.    function AppleAlert()
    7.   {
    8.       print('hi, Apple')  
    9.   }
    10. }
    11.  
    12. class Grape
    13. {
    14.    function GrapeAlert()
    15.   {
    16.       print('hi, Grape')  
    17.   }
    18. }
    19.  
    20.  
    Задача: сделать так, чтобы можно было обращаться с методам класса Grape вот так:
    PHP:
    1.  
    2. $element  = new Apple();
    3. $element->GrapeAlert();
    4.  
    Вопрос: как это сделать?

    Заранее, спасибо...
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  3. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    подумать, что через полгода вы вернетесь к этому коду и будете угадывать, зачем у вас такой вызов.
     
  4. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Видел ,но не понял, как с помощью этого вызвать метод другого объекта "без извращений" типа использования конструкций "if...else" и перебора всех методов объекта.
     
  5. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    блядь

    PHP:
    1. <?php
    2. class Apple {    
    3.     function AppleAlert() {      
    4.         print('hi, Apple');
    5.     } 
    6. }   
    7.  
    8. class Grape extends Apple {
    9.     function GrapeAlert()   {
    10.        print('hi, Grape');
    11.     }
    12. }
    13.  
    14. $apple = new Grape();
    15. $apple->GrapeAlert();
    16. $apple->AppleAlert();
    17.  
    18.  
    PHP:
    1. <?php
    2. interface IFruit{
    3.     public function alert();
    4. }
    5.  
    6. class Apple implements IFruit{
    7.     public function alert(){
    8.         echo "I'm apple";
    9.     }
    10. }
    11.  
    12. class Grape implements IFruit{
    13.     public function alert(){
    14.         echo "I'm grape";
    15.     }
    16. }
    17.  
    18. $apple = new Apple();
    19. $apple->alert();
    20.  
    21. $grape = new Grape();
    22. $grape->alert();
    23.  
    24.  
    PHP:
    1. <?php
    2.  
    3. class Apple{
    4.     /**
    5.      * @var Grape
    6.      */
    7.     private $grape;
    8.  
    9.     public function alert(){
    10.         echo "I'm apple";
    11.     }
    12.    
    13.     public function setGrape(Grape $grape){
    14.         $this->grape = $grape;
    15.     }
    16.  
    17.     public function getGrape(){
    18.         return $this->grape;
    19.     }
    20. }
    21.  
    22. class Grape{
    23.     public function alert(){
    24.         echo "I'm grape";
    25.     }
    26. }
    27.  
    28. $element = new Apple();
    29. $element->setGrape( new Grape());
    30. $element->alert();
    31. $element->getGrape()->alert();
    32.  
    Ну и самый плохой способ:
    PHP:
    1. <?php
    2. class Apple
    3. {
    4.     function __call($name, $arguments){
    5.         if (method_exists('Grape', $name)){
    6.             $grape = new Grape();
    7.             return call_user_func_array(array($grape, $name), $arguments);
    8.         }
    9.         assert(false);
    10.     }
    11.  
    12.     function AppleAlert(){
    13.         echo("hi, Apple\n");
    14.     }
    15. }
    16.  
    17. class Grape extends Apple
    18. {
    19.     function GrapeAlert(){
    20.         print("hi, Grape\n");
    21.        
    22.     }
    23. }
    24.  
    25. $apple = new Apple();
    26. $apple->GrapeAlert();
    27. $apple->AppleAlert();
    28.  
     
  6. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Никак. Я предпочитаю использовать 3й вариант из перечисленных topas
     
  7. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    А мне 4-ый вариант понравился, вечером попробую разобрать. Сам пока написал по 3-ему варианту.
     
  8. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    topas дурак. Забудь про ООП
     
  9. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Эту оценку можете себе переадресовать. Про ООП согласен.
     
  10. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    topas
    чем больше в мире идиотов, тем дороже наши с тобой услуги :)
    так что не переживай по его поводу.
     
  11. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Хорошо что у меня это хобби, а не способ заработка.
     
  12. ты знал мою преподвательницу по уголовному праву и адвокатскому делу? ))))
     
  13. bobroff

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

    С нами с:
    20 мар 2009
    Сообщения:
    44
    Симпатии:
    0
    Имхо начался флуд, тему можно закрывать.
     
  14. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    а ты сейчас доцент и проектировщик зданий?)))
    http://bash.org.ru/quote/402378