Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wywołanie funkcji
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
Fred1485
Mam przykładowy kodzik:

  1. <?php
  2.  
  3. function pisz() {
  4.  
  5. $zmienna = 1;
  6. $zmienna2 = 2;
  7.  
  8. return ($zmienna + $zmienna2);
  9.  
  10. } // nie chodzi o sam kod, jest on tylko przykładowy biggrin.gif
  11. ?>


I teraz w dokumencie php chcąc tą funckję wywołać to muszę przykładowo pisz();

Pytanie czy da się zrobić tak żeby funkcja była wywołana wtedy gdy jest umieszczona w kodzie bez tego wywoływania (np pisz();)czy za każdym razem trzeba to zrobić?
Fred1485
Ale ja nie chcę sprawdzać czy funkcja została wywołana tylko przy jej definiowaniu ją "od razu" samoistnie wywołać biggrin.gif
johny_s
aaa, to było jaśniej wink.gif

to w pliku ktorym ja definiujesz od razu daj jej wywołanie
maki1234
Ale tez muszę ją wywołać ręcznie? Nie mogę w funkcji zaznaczyc zeby sie wywołała? Wiem że to trochę dziwne co mówię
Tuminure
Cytat
Ale tez muszę ją wywołać ręcznie? Nie mogę w funkcji zaznaczyc zeby sie wywołała? Wiem że to trochę dziwne co mówię

Deklaracja funkcji nie uruchamia jej. Zastanawia mnie, czemu nie możesz po prostu użyć po prostu "pisz();"?
johny_s
możesz pobrać wszystkie funkcje
http://php.net/manual/en/function.get-defined-functions.php
php samo z siebie nie wywołuje wszystkich możliwych funkcji
maki1234
No mogę mogę ale tak mnie to zastanawiało smile.gif troszkę patrzylem w kody cms i tak nie zauważyłem jak wywołują ale deklarują musze to dokladniej przeanalizować wink.gif dzięki
Mariner
Cytat(maki1234 @ 16.03.2015, 16:54:00 ) *
Ale tez muszę ją wywołać ręcznie? Nie mogę w funkcji zaznaczyc zeby sie wywołała? Wiem że to trochę dziwne co mówię


Nie można wywołać funkcji bez jej wywołania. A jeżeli wywołanie funkcji umiejścisz w jej ciele to powstanie nieskończona pęta.
To co piszesz świadczy o błędnym sposobie podejścia do konstruowania skryptów. Jest to niezgodne z zasadami sztuki mówiącymi chociażby o wielokrotnym wykorzystaniu tego samego kodu. Deklaracji funcji i innego kodu nie umieszczaj w miejscu jej wywołania ale w bibiotekach. Inaczej powstaje chaos.

Cytat(maki1234 @ 16.03.2015, 17:08:15 ) *
No mogę mogę ale tak mnie to zastanawiało smile.gif troszkę patrzylem w kody cms i tak nie zauważyłem jak wywołują ale deklarują musze to dokladniej przeanalizować wink.gif dzięki


Być może używają wywołań funkcji w sposób nieliteralny nie np. "pisz()" tylko np. $functionPisz() ale na pewno ten cms nie działa to w taki sposób że deklaracja fukcji wywołuje ją w miejscu jej deklaracji.
maki1234
Czyli najlepiej utworzyc jakis plik np functions.php i tam wszystkie funkcje trzymać?
robertpiaty
Funkcję można też wywołać np. tak
http://php.net/manual/en/function.call-user-func.php
trueblue
Możesz wywołać funkcję anonimową, podobnie jak w JS: (function(){alert(1);})();

  1. call_user_func(function(){
  2. echo '1';
  3. });

Tylko jaki to ma sens...
johny_s
Cytat(Mariner @ 16.03.2015, 17:16:18 ) *
A jeżeli wywołanie funkcji umiejścisz w jej ciele to powstanie nieskończona pęta.

To jest tzw. wywołanie rekurencyjne i nie zawsze oznacza nieskończoną pętlę


Cytat(maki1234 @ 16.03.2015, 17:20:25 ) *
Czyli najlepiej utworzyc jakis plik np functions.php i tam wszystkie funkcje trzymać?

nie, bo po jakimś czasie Ci się plik rozrośnie i nagle zauważysz że ma kilkadziesiąt/set funkcji
pogrupować w pliki "tematycznie" czyli klasy -> doczytać oop
maki1234
Moglbys coś wiecej o tych klasach? Jakis artykułl o tym czy cos? Nie mysl ze czekam na gotowe ale na razie nie wiem dokladnie co za "czarna magia" to jest "(
Mariner
Cytat(maki1234 @ 16.03.2015, 17:20:25 ) *
Czyli najlepiej utworzyc jakis plik np functions.php i tam wszystkie funkcje trzymać?


Zgasza się.
Wyobraź sobie co musiał byś zrobić kiedy będziesz chciał użyć funkcji "pisz" ponowanie w jakimś innym miejscu, jeżeli zadeklarujesz ją np. w pliku szalobnu. Iportować szablon html żeby wywołać funkcję? Totalna pomyłka. Lepszym rozwiązaniem jest kiedy deklaracje funcji umiesza się w jednym pliku np. functions.php który pełni rolę bibioteki i inludować tylko zawsze ten sam plik zawsze kiedy potrzebujesz użyć zadeklarowanych w nim funkcji. Między innymi dlatego język jest tak skonstruowany bo zakłada takie własnie użycie.
Fred1485
Mariner,

Cytat
nie, bo po jakimś czasie Ci się plik rozrośnie i nagle zauważysz że ma kilkadziesiąt/set funkcji
pogrupować w pliki "tematycznie" czyli klasy -> doczytać oop


W takim razie jak się do wypowiedzi kolegi ustosunkujesz?
Mariner
Cytat(maki1234 @ 16.03.2015, 17:34:14 ) *
Moglbys coś wiecej o tych klasach? Jakis artykułl o tym czy cos? Nie mysl ze czekam na gotowe ale na razie nie wiem dokladnie co za "czarna magia" to jest "(


To o co pytasz to programowanie obiektowe. O programowaniu obiektowych w php jest dużo w necie, nie problem znaleźć. Niemniej jest to jedna z najbardziej istotnych kwestii i podstawa pracy programisty. Także obowiązkowo musisz znać i posługiwac się programowaniem obiektowym.

Cytat
W takim razie jak się do wypowiedzi kolegi ustosunkujesz?


Żeby organizować funckje w klasy wpierw trzeba znać przeznaczenie tych funkcji. Wobec zadanego pytania, czy deklaracje umieszczać w miejscu wywołania, wystarczającą informacją jest to że należy trzymać kod w plikach bioblitecznych a czy ma to być tylko jeden plik oraz czy ma zwierać klasy zamiast funkcji, to kwestia względna i w tym pytaniu zdaje się nie istotna.

Cytat
To jest tzw. wywołanie rekurencyjne i nie zawsze oznacza nieskończoną pętlę


Naprawdę? A gdzie jest napisane że "zawsze oznacza"?
Fred1485
O programowaniu obiektowym słyszałem i też go troszkę już próbuję wink.gif Ale jak to się ma do tego pliku functions.php z wszystkimi funkcjami? Kolega wyżej napisał że to zły pomysł bo się plik rozrośnie do wielu linijek kodu...
Mariner
Cytat
O programowaniu obiektowym słyszałem i też go troszkę już próbuję wink.gif Ale jak to się ma do tego pliku functions.php z wszystkimi funkcjami? Kolega wyżej napisał że to zły pomysł bo się plik rozrośnie do wielu linijek kodu...


Duże partie kodu bibiotecznego umieszcza się w róznych plikach ze względów wydajnościowych, żeby nie ładować funkcji których nie potrzebujemy. Odpowiedź kolegi, o wielu plikach bibiotecznych opiera się na złozeniu że będziesz miał dużo funkcji. Ja tego nie wiem ile masz funkcji. Starałem się przedstawić Tobie jedynie tylko koncepcję mówiącą że deklarację umiejszczamy w bibiotekach a czy będzie to jeden plik czy wiele kwestia względna zależy od Ciebie.

W dużej ilość funcji faktycznie dobrym pomysłem jest ich podzielenie na plikich wedłuch spełnianych przez nie zadań. Np. wszystkie funkcje odpowiedzialne za komunikację z bazą umieszczamy w pliku functions_db.php, funkcje odpowiedzialne za przetwarzenie html functions_helper.php i tak dalej. Wtedy mamy łatwe rozeznanie który plik w danym momencie mamy zaincludować. I tak, jak wykonujemy update bazy danych to includujemy plik z funkcjami odpowiedzialnymi za komunikację z bazą danych, jak obrabiamy gdzieś html to potrzebuemy plik tylko z funkcjami odpowiedzialnymi za html. Zauważ że dzięki temu nie ładujemy wszystkich fukcji, osczędzając dzięki temu pamięć i nie obciążając serwer.
Z drugiej zaś strony jezeli masz np. tylko dwie funkcje to jaki jest sens umieszczania ich w osobnych plikach? Chyba żaden. Lepiej umieścić je w jednym pliku.
Tak to generalnie w skrócie wygląda.
Boshi
Cytat(Mariner @ 16.03.2015, 17:45:17 ) *
Naprawdę? A gdzie jest napisane że "zawsze oznacza"?


Napisałeś to tak jak by zawsze wywoływało nieskończoną pętlę... precyzuj albo nie pisz głupot.


@autor, możesz pogrupować sobie w foldery odpowiednie biblioteki funkcyjne, wtedy łatwiej się odnaleźć we wszystkim.
Mariner
Cytat(Boshi @ 16.03.2015, 18:31:05 ) *
Napisałeś to tak jak by zawsze wywoływało nieskończoną pętlę... precyzuj albo nie pisz głupot.


Za mojej wypowiedzi nic nie wynika że zawsze czy nie zawsze bo to nie istotne a "tak jak by" to chyba Ty i kolega wyciagacie wnioski zbyt pochopnie.
Fred1485
Pytalem czysto teoretycznie milo mi ze taka dyskusja sie rozwinela
Mariner
Fred, a tak w ogóle to co, dopiero zaczynasz? Długo już się bawisz skryptami?
Fred1485
Nie zaczynając nowego tematu wink.gif

@Mariner zaczynam dopiero przyznam że mnie to interesuje i jak mam jakąś sprawę niejasną to się zwracam do userów na forum bo często takich rzeczy na google nie ma biggrin.gif

Ale do rzeczy, chodzi mi o funkcję zwracającą wartość, wszystko jasne mam taki kod:

  1. <?php
  2.  
  3. function connect_database() {
  4.  
  5. //dane do bazy ukryte
  6.  
  7. $database = @new mysqli(HOST, USER, PASSWORD, DATABASE);
  8.  
  9. if($database->connect_errno) {
  10.  
  11. $output = array('type' => 'error', 'text' => 'Błąd połączenia z bazą danych! Sprawdź konfigurację połączeniową!');
  12. return $output;
  13. }
  14. if(!$database->set_charset("utf8")) {
  15.  
  16. $output = array('type' => 'error', 'text' => 'Błąd wyboru kodowania!');
  17. return $output;
  18. }
  19.  
  20. $output = array('type' => 'success', 'text' => 'OK');
  21. return $output;
  22.  
  23.  
  24. }
  25.  
  26. $database = connect_database();
  27. echo $database['type']. ' '. $database['text'];
  28.  
  29.  
  30. ?>


Co do działania tego kodu nie mam zastrzeżeń, ale skoro ja sam w funkcji definiuję co ona ma zwrócić to w przypadku wystąpienia błędu zwraca tablicę i wyświetla "Błąd połączenia z bazą danych! Sprawdź konfigurację połączeniową!" ale do tego wywala też błąd że nie można się połączyć z mysqli (wiadomo 2 linijki błędu) ale takie pytanie jako początkujący mam: wiem że dam sobie @ przed zmienną i się ten błąd już nie wyświetlia ale dlaczego tak jest? Przecież ja zwracam tylko tablicę output a ten błąd nie powinien się zwrócić... (POWINIEN? NO TAK ALE CZEMU? biggrin.gif )
com
Bo php to jezyk interpretowany zreszta w normalnym jezyku masz tak samo. On wykonuje wszystko po kolei i jesli napotka blad to ten blad sie pokaze bo na nim interpreter sie zatrzyma. Dodanie @ to nic innego jak zaciemnienie czyli blad sie nie pokaze ale itak wystapi. Dlatego @ jest zla i sie jej nie uzywa. A wyjatki przechwytuje sie w blokach try catch
Fred1485
No ale w tym przypadku uzasadnione jest dodanie @ bo ja i tak wiem czy jest błąd czy go nie ma wink.gif
com
Owszem sprawdzasz czy wystapil ale to nie sprawi ze jak on wystapi to ze skrypt sie nie zatrzyma smile.gif @ oszukujesz poprostu skrypt i on idzie dalej smile.gif
Fred1485
Czyli co proponujesz zmienić w tej funkcji?

@----EDIT----

  1. <?php
  2.  
  3. function connect_database() {
  4.  
  5. define('HOST', 'mysqdl1.ugu.pl');
  6. define('DATABASE', 'db675386');
  7. define('USER', 'db675386');
  8. define('PASSWORD', 'ZAQ!2wsx');
  9.  
  10. $database = new mysqli(HOST, USER, PASSWORD, DATABASE);
  11.  
  12. if($database->connect_errno) {
  13.  
  14. $output = array('type' => 'error', 'text' => 'Błąd połączenia z bazą danych! Sprawdź konfigurację połączeniową!');
  15. die;
  16. }
  17. if(!$database->set_charset("utf8")) {
  18.  
  19. $output = array('type' => 'error', 'text' => 'Błąd wyboru kodowania!');
  20. die;
  21. }
  22.  
  23. $output = array('type' => 'success', 'text' => 'OK');
  24. return $output;
  25.  
  26.  
  27. }
  28.  
  29. ?>


Dobrą rzeczą byłoby zatrzymanie działania całego kodu jeśli błąd np?
com
Uzyj poprostu http://php.net/manual/en/class.mysqli-sql-exception.php
Fred1485
mógłbyś troszkę jaśniej do czego to służy bo jedno zdanie niewiele mi mówi sad.gif
com
No wylapuje Ci wyjatki ktore wystapia podczas dzialania skrypu i zwraca odpowiedni komunikat. Mozna nie zwracac a tylko przechwycic i przekazac dalej smile.gif poczytaj o wyjatkach w php a zrozumiesz smile.gif bo nie ma sensu zebym przepisywal tobie tu definocje smile.gif
Fred1485
Poczytam z chęcią wink.gif

Czyli dzięki tym wyjątkom mogę tą moją przykładową funkcję jakoś lepiej zbudować?
com
Tak bo zlapiesz wszystkie bledy i przy okazji masz nad nimi kontrole smile.gif
Fred1485
  1. <?php
  2.  
  3. function database() {
  4.  
  5. define('HOST', '...');
  6. define('USER', '...');
  7. define('PASSWORD', '...');
  8. define('DATABASE', '...');
  9.  
  10. try {
  11.  
  12. $database = new mysqli(HOST, USER, PASSWORD, DATABASE);
  13.  
  14. if($database->connect_errno) {
  15.  
  16. throw new Exception('Błąd połączenia z bazą danych!');
  17. }
  18. if($database->set_charset("utf-8")) {
  19.  
  20. throw new Exception('Błąd wyboru kodowania!');
  21. }
  22.  
  23. }
  24. catch(Exception $error) {
  25.  
  26. echo $error->getMessage();
  27. }
  28.  
  29. }
  30.  
  31. database();
  32. ?>


Teraz "ulepszyłem" (albo i nie biggrin.gif) skrpycik. Jeżeli można to prosiłbym o rady i opinie czy zrobiłem to dobrze, lub czy można to jeszcze poprawić.

Niestety, chociaż wszystko działa jak najbardziej poprawnie to dalej przy błędnych danych do bazy wyświetli się mój komunikat ale też php doda swoje 2 linijki że połączenia nawiązać nie można sad.gif
Tuminure
@up
A to wszystko dlatego, że koledzy wyżej zapomnieli, że notice/warning to nie exception.

Ale jeżeli przed tym dorzucisz (np. na samym początku kodu)
  1. mysqli_report(MYSQLI_REPORT_STRICT);
to php rzuci wyjątkiem w przypadku nieprawidłowego połączenia się z bazą danych (miej na uwadze, że linijki 13-22 z Twojego kodu nie zostaną wykonane, a co za tym idzie dostaniesz błąd wygenerowany przez php, a nie przez Ciebie).
Fred1485
No ok widzę jak to działa, ale chcąc np uzyskać efekt jaki ja chcę na pewno jakoś się da bo np w Extreme fusion, php fusion czy choćby w php by przemo jest to ładnie rozwiązanie, tzn wyświetla się "ładny" błąd wink.gif

Czyli bazując na wyjątkach dalej tego efektu nie osiągnę?...
P.S Szukam w plikach od tych cms jak to jest zrobione ale na razie nie mogę się dokopać głębiej...
Tuminure
Nikt nie każe Ci przecież robić
  1. echo $error->getMessage();
Zawsze możesz przecież zrobić
  1. echo $szablonLadnejStrony;
Fred1485
Czyli co chcesz przez to powiedziec? Jakos ten błąd "upiększyć" ? Nadal nie ma tego efektu jak bym chcial miec smile.gif muszę się dogrzebac do tych plikow od cms
Tuminure
Możesz zarzucić jakimś screenem, który zaprezentuje jaki efekt chcesz osiągnąć?
Fred1485
Tak za jakies pół godzinki screen będzie jak do domu wrócę smile.gif

Proszę, tak prezentuje się u mnie:



A tak lepiej na php by przemo:



Jednak tutaj jakoś ładniej użytkownika informuje skrypt wink.gif

@----EDIT----

Przepatrzyłem te cms'y i ku mojemu zdziwnieniu we wszystkich jest podstawowa obsługa błędów, ale jednak połączenie jest "zabezpieczone" za pomocą @ żeby jednak tych błędów nie wywaliło biggrin.gif Jednak trzeba będzie tej małpki użyć biggrin.gif
Tuminure
Cytat
Przepatrzyłem te cms'y i ku mojemu zdziwnieniu we wszystkich jest podstawowa obsługa błędów, ale jednak połączenie jest "zabezpieczone" za pomocą @ żeby jednak tych błędów nie wywaliło biggrin.gif Jednak trzeba będzie tej małpki użyć biggrin.gif

Z tą "@" jest taki problem, że na serwerze produkcyjnym i tak wyłącza się wyświetlanie jakichkolwiek błędów (w tym notice i warningów). Podczas rozwijania kodu zaś, informacja o tego typu błędach jest pożądana. Dlaczego więc stosować "@"?
Kloc
Cytat(Tuminure @ 18.03.2015, 21:35:21 ) *
...Dlaczego więc stosować "@"?


Po co np. masz jakiś moduł do aplikacji, który dołączasz za pomocą include. Aplikacja jest sprzedawana bez modułów, które można sobie dokupić.
Ale notka w kodzie o nim musi być, bo chyba nie kazesz klientowi samemu edytowac skryptu.
Gdy include nie wykryje pliku to sypnie błedem, ale to, że go nie ma to nie odrazy błąd, tylko to, że ktoś go sobie nie kupił.
"@" świetnie się tutaj nadaje, by to ukryć.
Fred1485
Ale wróćmy do tematu jak uważacie czy tej @ mozna użyć czy raczej to zla praktyka?
phpion
Oczywiście, że zła praktyka. Błędy należy wyeliminować/obsługiwać, a nie je tłumić. Chyba, że masz wybitnie uzasadniony przypadek.
Fred1485
Ale przeciez próbuje ten blad wyeliminować tylko za cholerę sie tego nie da zrobić sad.gif
Mariner
Cytat(Fred1485 @ 19.03.2015, 15:29:59 ) *
Ale przeciez próbuje ten blad wyeliminować tylko za cholerę sie tego nie da zrobić sad.gif


Upewnij się że prawidłowe są dane za pomocą których następuje próba autoryzacji w serwerze bazy danych. Błąd mówi coś o nieznanym adresie host.
Błąd zrzucany jest dlatego że skrypt nie może połączyć się do bazy bo albo dane są nieprawidłowe lub adresat nie istnieje.
Fred1485
Dane do bazy specjalnie podaję złe żeby poradzić sobie z tym bledem i go ładniej obsluzyc...
Mariner
Więc zaraz po próbie nawiązania połączenia, powinieneś

1. sprawdzić czy połączenie zostało nawiązane
2. jeżeli połączenia nie nawiązano
2.1 zrzucić wyjątek.

Tylko że taki scenariusz ma sens tylko wtedy kiedy masz w swoim systemie kod który takie wyjątki obsługuje, potrafi je przechwycić z zamienić na odpowiedź.

Jeżeli nie masz, to od punktu 2 możesz wykonać przekierowanie na np. statyczną stronę z błędem.
Fred1485
Owszem wyjątek pięknie zostanie obsłużony i wyświetli rządany komunikat tylko że warning dalej będzie wink.gif
com
Kloc Co za bzdury, jak już budujesz aplikacje modułowe to nie dajesz wywołania do modułu który nie jest wbudowany a nie wyciszasz coś wink.gif
Bo źle łapiesz te wyjątki, błędem rzuca Ci ten if if($database->connect_errno)
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.