Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Domyślny argument metody i $this
Forum PHP.pl > Forum > Przedszkole
ocochodzi
kod:

  1. <?php
  2. class A
  3. {
  4. public function Trzy()
  5. {
  6. return 3;
  7. }
  8. public function Pisz($par = $this->Trzy())
  9. {
  10. echo $this->Trzy();
  11. }
  12. }
  13.  
  14. $a = new A();
  15. $a->Pisz();
  16. ?>


w linii 8 daje błąd składni. Ten $this najwyrazniej w tym miejscu nie ma prawa wystąpić.


Chcę by domyślna wartość parametru metody była liczona przez inną metodę obietu. Problem mogę obejść konstrukjcją:

  1. <?php
  2. class A
  3. {
  4. public function Trzy()
  5. {
  6. return 3;
  7. }
  8. public function Pisz($par = 'sztuczny')
  9. {
  10. if($par == 'sztuczny')
  11. $par = $this->Trzy();
  12. echo $par;
  13. }
  14. }
  15.  
  16. $a = new A();
  17. $a->Pisz();
  18. ?>


Tylko, że to już jest łatanie problemu zaciemniajace kod.


Pytania:

1) czy isnieje eleganckie rozwiązanie, tzn. użycie jako argumentu domyslnego tego co chcę. Może jakieś specjalne słówko kluczowe?

2) jeśli odpowiedz na 1) jest negatywna, to czemu? Tzn. czy stoją za tym jakieś głebokie podstawy działania PHP? Jakoś nie widzę, skoro obejście problemu jest automatyczne. Chyba, ze dogmat o ograniczeniu $this do ciała metody.
nevt
1. Istnieją dwa eleganckie rozwiązania, ale żadne nie jest zgodne z twoimi oczekiwaniami:
  1. <?php
  2. // albo tak
  3. class A
  4. {
  5. public function Trzy()
  6. {
  7. return 3;
  8. }
  9. public function Pisz($par = null)
  10. {
  11. echo is_null($par) ? $this->Trzy() : $par;
  12. }
  13. }
  14.  
  15. $a = new A();
  16. $a->Pisz();
  17.  
  18. // albo tak
  19.  class A
  20.  {
  21.  public function Trzy()
  22.  {
  23.  return 3;
  24.  }
  25.  public function Pisz($par)
  26.  {
  27.  echo $par;
  28.  }
  29.  }
  30.  
  31.  $a = new A();
  32.  $a->Pisz($a->Trzy());
  33. ?>


2. To nie ma nic wspólnego z zasięgiem $this. to wynika wprost ze składni i gramatyki PHP - parametrem domyślnym funkcji może być wyłącznie stała - nie wolno stosować zmiennych lub rezultatów funkcji.

a oba powyższe rozwiązania nie są żadnym obejściem problemu. to twoja koncepcja niejawnego przekazywania zmiennego parametru jest niezgodna ze standardami programowania i niepotrzebnie zaciemnia kod. a dlaczego? bo patrząc zarówno na miejsce wywołania jak i na definicję metody Pisz nie możemy wywnioskować rezultatów jej działania
ocochodzi
Dziękuję za odpowiedź. Wiele mi wyjaśniła.

Cytat
to twoja koncepcja niejawnego przekazywania zmiennego parametru jest niezgodna ze standardami programowania i niepotrzebnie zaciemnia kod. a dlaczego? bo patrząc zarówno na miejsce wywołania jak i na definicję metody Pisz nie możemy wywnioskować rezultatów jej działania


Przemyślałem sprawę. Nie za bardzo połapałem twoje tłumaczenie (akurat w tym prostym przykładzie wszystko da się łatwo wywnioskować), ale postawiłem się w roli oskarżyciela i znalazłem ogólniejszy argument: Te moje podejście to de facto wrzucanie do nagłowka funkkcji cześci jej implementacji. I jak się spojrzy pod tym katem to faktycznie zaciemna...Niczym goto, którego szkodliwość w trywalnych przykładach trudno uzasadnić.

Cytat
1. Istnieją dwa eleganckie rozwiązania, ale żadne nie jest zgodne z twoimi oczekiwaniami:


To z nullem w zasadzie nie odbiega od tego co podalem. Taki sztuczny parametr domyślny, który służy jedynie do zasygnalizowania, ze nie podano argumentu. Null jest zwykle naturalniejszy, ale gdybyśmy go faktycznie chcieli przekazać funkcji, to na sztuczny paramter domyślny trzeba wybrać co innego.

To drugie, to rezygnowanie z prostoty wywołań. W mojej aplikacji są całe ciągi wywołań metod, gdzie jedzie się na domyślnym ustawieniu. Nie cchcę zaciemniać kodu.

Jescze raz dziękuje

Ale dałem d.. z tym thisem w w wywołaniu. Człowiek uczy sie całe życie.
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.