За последние 24 часа нас посетили 26604 программиста и 1482 робота. Сейчас ищут 916 программистов ...

Вопрос о method_exists() и call_user_func_array().

Тема в разделе "PHP для новичков", создана пользователем running-frag, 15 ноя 2009.

  1. running-frag

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

    С нами с:
    4 сен 2008
    Сообщения:
    65
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3. $page = $_GET["p"];
    4. $action = $_GET["action"];
    5. $id = $_GET["id"];
    6.    
    7. $controller_name = $page;
    8. $model = $controller_name;
    9.    
    10. $controller = "control_$controller_name";
    11.  
    12. $dispatch = new $controller ($model, $controller_name, $action);
    13.  
    14. if (method_exists($controller, $action))
    15. {
    16.     call_user_func_array(array($dispatch, $action), $id);
    17. }
    18. else
    19. {/* some error*/}
    20.  
    21. function __autoload ($class_name)  
    22. {/* autoload classes and models */}
    23. ?>
    24.  
    Перелопачиваю тут код один под себя, стараюсь максимум понять. Код выше рабочий. Но я не могу понять смысл двух функций...

    1. В method_exists() входит $controller и $action. Ну с $action всё ясно. А вот с первым. В $controller записан "control_$controller_name", т.е. строка. В манке написано что нужен $object (обьект). Тут как? __autoload выручает создавая новый обьект по имени класса (хотя мы ж не обьявляли его!) или же откуда у нас в if() появляется TRUE?

    2. Функция call_user_func_array() вообще сцуго загадочное явление. XD Насколько мне стало ясно по манке это "call_user_func_array -- Вызывает пользовательскую функцию с массивом параметров" (с) php.ru Первое мне не ясно тут нахрена нам тут array() ? Ну я ещё смогу понять зачем array() если в нём будут входные данные. Но у нас же там обьект и строка. Как это понимать то? :( При том что по мануалу чётко видно :
     
  2. running-frag

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

    С нами с:
    4 сен 2008
    Сообщения:
    65
    Симпатии:
    0
    Просто я бы по другому писал бы.
    1. if (method_exists($dispatch, $action))
    2. $dispatch->$action($id);

    Мне просто интересно почему автор использывал такой подход.
     
  3. Simpliest

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

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

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

    С нами с:
    4 сен 2008
    Сообщения:
    65
    Симпатии:
    0
    Честно говоря не понял смысл онной функции call_user_func_array(), точнее как её "разумно" использывать. Но хотелось бы узнать чем хуже использывать то что я привёл постом выше? Какие будут разности ну или потенциальные "дыры" в такой системе?
     
  5. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    running-frag
    если у тебя один параметр, то разницы в принципе нету между твоим подходом и в первом посте (разве что твой более понятен).
    но если у тебя несколько параметров и количество их может различаться, то тут и поможет call_user_func_array().