Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazywanie return z 1 funkcji do parametru 2 funkcji
Forum PHP.pl > Forum > PHP > Object-oriented programming
MESSIAH :)
Sorki za moją nie wiedzę - nie jestem PRO. Mam mały problem ze zrozumieniem przekazywania zwracanej wartości i "odebraniu" jej jako argument dla drugiej funkcji w tej samej klasie. Mianowicie:
  1. <php
  2. Class Klasa
  3. {
  4. public static $var1 = __DIR__;
  5. public static $var2 = [];
  6. public function Funkcja1(){
  7. BlaBlaBlaBla
  8. return self::var2;
  9. }
  10. public function Funkcja2($var2){
  11. BlaBlaBla
  12. }
  13. }

Jak zrobić aby wynik $var2 trafiał jako argument do drugiej funkcji?
Skie
Po 1. Wyrzuć wszystkie static z klasy - to zło tongue.gif Jak chcesz wiedzieć czemu to wygoogluj "PHP why static are harmful" albo jakieś podobne hasło.

Po 2.
Deklaracja:

  1. Class Klasa
  2. {
  3. public $var1 = __DIR__;
  4. public $var2 = [];
  5.  
  6. public function Funkcja1(){
  7. return $this->var2;
  8. }
  9.  
  10. public function Funkcja2($var2){
  11. //
  12. }
  13. }


Wykonanie:

  1. $obj = new Klasa();
  2.  
  3. $obj->Funkcja2($obj->Funkcja1());

A jeśli chcesz by Funkcja1 automatycznie swoją zwracaną wartość przeprowadzała przez Funkcja2, to wtedy w Funkcja1 zmień return na:

  1. return $this->Funkcja2($this->var2);
MESSIAH :)
Cytat(Skie @ 11.08.2015, 00:12:47 ) *
A jeśli chcesz by Funkcja1 automatycznie swoją zwracaną wartość przeprowadzała przez Funkcja2, to wtedy w Funkcja1 zmień return na:

  1. return $this->Funkcja2($this->var2);

Czy mogę używać kilka return w 1 funkcji dla kolejnych funkcji. Czy raczej panuje zasada 1 return na 1 funkcje?
Pyton_000
Tak się nie robi.
Masz zwrócić obiekt/wartość/tablice/string czy co tam sobie chcesz i potem dopiero przekazać do wywołania kolejnej funkcji.
Czyli Przypadek:
  1. $obj = new Klasa();
  2. $var1 = $obj->Funkcja1();
  3. $var2 = $obj->Funkcja2($var1);
Skie
@Pyton_000 Nie rób chłopakowi wody z mózgu, bo potem będzie myślał, że jakakolwiek interakcja między metodami wewnątrz klasy to zły pomysł.
@MESSIAH smile.gif Tak, jeśli jesteś pewny, że Funkcja1 musi przepuścić zawsze swój wynik przez Funkcja2, by zwracała to czego oczekujesz to dobry zapis.

Cytat
Czy mogę używać kilka return w 1 funkcji dla kolejnych funkcji. Czy raczej panuje zasada 1 return na 1 funkcje?


Wywołanie return kończy wykonywanie funkcji, więc wykonanie paru takich instrukcji jest technicznie niemożliwe. Możesz za to zwracać tablicą lub obiekt, jeśli potrzebujesz naraz zwrócić parę elementów.
Pyton_000
@Skie Jeśli obie metody są publiczne to nie, nie powinno się tak robić. Co innego jeśli wydzielamy kawałek kodu do metody prywatnej/chronionej to tak, można zrobić operacje łączenia metod wew.
Skie
@Pyton_000 bzdury pleciesz. Nawet w przypadku jeśli obie metody są publiczne to jak najbardziej można zastosować taki zabieg. Najprostszy przykład:

  1. class A
  2. {
  3. protected $id;
  4. protected $name;
  5.  
  6. public function getId() {
  7. return $this->id;
  8. }
  9.  
  10. public function getName()
  11. {
  12. return $this->name;
  13. }
  14.  
  15. public function toString()
  16. {
  17. return "[" . $this->geId() . "] = " . $this->getName();
  18. }
  19. }


lub inny przykład - tworzysz klasę, która zapewnia jakąś skomplikowaną funkcjonalność - np Dependency Injection Container - i tworzysz do niego metodę, która umożliwia bindowanie definicji do kontenera z bardzo skomplikowanym API. Niestandardowe configi zdarzają się rzadko, ale jednak czasem user ich wyamga, więc metodę dajesz jako publiczną, by udostępnić pełną funkcjonalność swojej klasy. Najczęściej jednak użytkownicy jednak nie potrzebują tak skomplikowanego API, więć dodatkowo tworzysz publiczne bind(), instance(), singleton(), call() etc. które nie robią nic innego jak wywołują tę skomplikowaną metodę z odpowiednio ustawionym configiem.

Przykłady można mnożyć...
MESSIAH :)
Cytat(Skie @ 11.08.2015, 00:12:47 ) *
Po 1. Wyrzuć wszystkie static z klasy - to zło tongue.gif Jak chcesz wiedzieć czemu to wygoogluj "PHP why static are harmful" albo jakieś podobne hasło.

Po 2.
Deklaracja:

  1. Class Klasa
  2. {
  3. public $var1 = __DIR__;
  4. public $var2 = [];
  5.  
  6. public function Funkcja1(){
  7. return $this->var2;
  8. }
  9.  
  10. public function Funkcja2($var2){
  11. //
  12. }
  13. }


Wykonanie:

  1. $obj = new Klasa();
  2.  
  3. $obj->Funkcja2($obj->Funkcja1());

A jeśli chcesz by Funkcja1 automatycznie swoją zwracaną wartość przeprowadzała przez Funkcja2, to wtedy w Funkcja1 zmień return na:

  1. return $this->Funkcja2($this->var2);

Niestety nie działa to prawidłowo gdyż zawsze zwraca mi pustą tablice $var2: [0]
Skie
Jakby nie patrzeć $var2 to jest pusta tablica, więc nie wiem czego konkretnie się tam spodziewałeś. Pokaż swój kod, bo znając życie coś zrobiłeś źle.
KsaR
W self w odowlaniu do własności używa się także znaku dolara, w przeciwienstwie do $this.

Czyli

Nie:

return self::var2;

A:

return self::$var2;
MESSIAH :)
Już działa mały błąd się wkradł a mianowicie brak $this w jednym z wierszy.
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-2024 Invision Power Services, Inc.