Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Funkcja jako parametr
Black-Berry
post 2.11.2008, 22:58:57
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
WebCM
post 2.11.2008, 23:00:53
Post #2





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
Black-Berry
post 2.11.2008, 23:07:33
Post #3





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


le jak przekażę tylko nazwę funkcji to jak ją wywołac wewnątrz klasy ?


--------------------
Go to the top of the page
+Quote Post
nexis
post 2.11.2008, 23:10:12
Post #4





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
WebCM
post 2.11.2008, 23:13:15
Post #5





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował WebCM 2.11.2008, 23:13:42


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
Go to the top of the page
+Quote Post
Black-Berry
post 3.11.2008, 09:55:08
Post #6





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ą.


--------------------
Go to the top of the page
+Quote Post
empathon
post 3.11.2008, 18:24:33
Post #7





Grupa: Zarejestrowani
Postów: 246
Pomógł: 31
Dołączył: 13.11.2006
Skąd: się znamy?

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Goldenline: Łukasz Rodziewicz
Go to the top of the page
+Quote Post
Black-Berry
post 3.11.2008, 19:45:35
Post #8





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
empathon
post 3.11.2008, 19:56:49
Post #9





Grupa: Zarejestrowani
Postów: 246
Pomógł: 31
Dołączył: 13.11.2006
Skąd: się znamy?

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Goldenline: Łukasz Rodziewicz
Go to the top of the page
+Quote Post
Black-Berry
post 4.11.2008, 09:48:14
Post #10





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


To czad. Wielkie dzięki smile.gif

Co sądzicie o takim rozwiązaniu na formularze?


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 12:15