Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja jako parametr
Forum PHP.pl > Forum > PHP
Black-Berry
Mam obiekt Formularz:

  1. <?php
  2. $form = new Form(
  3.    array(
  4.        'name' => 'myForm',
  5.        'method' => 'post',
  6.        'action' => 'index.php',
  7.    )
  8. )
  9. ?>


No i chciałbym teraz zrobić takie coś:

  1. <?php
  2. function submit()
  3. {
  4.    //save to database...
  5. }
  6.  
  7. $form->onSubmit = submit()
  8. ?>


Czyli przekazać do obiektu jakąś funkcję. Czy to jest w jakiś sposób możliwe?
WebCM
Zobacz: create_function" title="Zobacz w manualu PHP" target="_manual
A jak nie, to przekaż tylko:
  1. <?php
  2. $form->onSubmit = 'submit';
  3.  
  4. //A w klasie:
  5. $this->onSubmit()
  6. ?>
Black-Berry
le jak przekażę tylko nazwę funkcji to jak ją wywołac wewnątrz klasy ?
nexis
Możesz tak zrobić i funkcja zwróci Ci jakąś wartość, np.:

  1. <?php
  2. function submit()
  3. {
  4.   // Zapis do bazy danych
  5.   return 'Komunikat';
  6. }
  7.  
  8. $form->onSubmit = submit();
  9. echo $form->onSubmit; // Komunikat
  10. ?>


ale ogólnie rzecz biorąc funkcje wywołuje się na rzecz obiektu, czyli coś tego typu:

  1. <?php
  2. try {
  3.   $form->submit();
  4. } catch (Exception $e) {
  5.   exit($e->getMessage());
  6. }
  7. ?>
WebCM
Po prostu do nazwy zmiennej dodajesz nawiasy. smile.gif Ewentualnie parametry w środku, jeśli trzeba.
  1. <?php
  2. $zmienna();
  3. $this->wlasnosc($a,$b,$c);
  4. ?>
Black-Berry
Dzięki za posty ale nie wiem czy do końca się zrozumieliśmy. Ja nie chcę do obiektu wysłać jakiejkolwiek zmiennej ale zestaw procedur jakie mają się wykonać w akcji onSubmit. Docelowo chce przekazać 2 procedury. Jedna onSubmit a druga onError. Obiekt sma decydowałby czy ma wykonać jedną czy drugą.
empathon
1. Funkcje są globalne.
2. PHP < 5.3 nie ma funkcji lambda czyli nie zrobisz:
  1. <?php
  2. $funkcja = function() { echo 'dump'; };
  3. ?>

Edit: bez nazwy funkcji

Wszelkie podobne cuda wiążą się z evalem i create_function a to ZUO w najczystszej postaci z najmroczniejszych zakamarków programistycznego ociemnienia.

Jeśli już upierasz się by zrobić to tak jak koledzy powyżej pisali:
-przekazujesz nazwę funkcji jako string:
  1. <?php
  2. $form->setSubmitFunction('submit');
  3.  
  4. //A w klasie:
  5. class Form {
  6. ...
  7. private $submit_function;
  8.  
  9. public function setSubmitFunction($name) {
  10. $this->submit_function = $name;
  11. }
  12.  
  13. public function onSubmit() {
  14. $this->submit_function();
  15. }
  16. }
  17. ?>
Black-Berry
Może wyjaśnię po co mi to. Chcę mieć w swoim frameworku taki bajer:

  1. <?php
  2. function mySubmitFunction($args)
  3. {
  4.    $someManager->add($args);
  5.    header('location: form1_submit_ok.html');
  6. }
  7.  
  8. $form = new Form();
  9. $form->addItem(new Form_Item(args));
  10. $form->addItem(new Form_Item(args));
  11. $form->addItem(new Form_Item(args));
  12. $form->onSubmit = 'mySubmitFunction';
  13. $form->drop();
  14. ?>


udało mi się to rozwiązać za pomocą call_user_func
empathon
Eh cały czas o tym mowa.

  1. <?php
  2. $function_name = 'lorem';
  3. $function_name(); //Uruchomi funkcji lorem
  4. ?>


jest równoważne:
  1. <?php
  2. $function_name = 'lorem';
  3. call_user_func($function_name); //Również odpali lorem
  4. ?>
Black-Berry
To czad. Wielkie dzięki smile.gif

Co sądzicie o takim rozwiązaniu na formularze?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.