Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Stała+string jako argument domyślny funkcji
Forum PHP.pl > Forum > PHP
kiler129
Witajcie!
Natrafiłem na dziwne ograniczenie którego nie potrafię przeskoczyć:

  1. <?php
  2. define("TEST", "abc");
  3.  
  4. function foo($a = TEST) { print($a); } //Wynik: abc
  5. function bar($a = "def") { print($a); } //Wynik: def
  6. function foobar($a = TEST."def") { print($a); } //Wynik: Parse error: syntax error, unexpected '.', expecting ')'
  7. ?>


Oczywiście mogę zrobić to tak:
  1. <?php
  2. function foobar($a = TEST) { $a .= "def"; print($a); } //Wynik: abcdef
  3. ?>


Ale w żaden sposób nie kojarzy się to z dobrym stylem pisania i przejrzystością kodu. Czy w PHP niemożliwe jest zdefiniowanie argumentu domyślnego funkcji składającego się z 2 części?
everth
Manual i cytat
Cytat
Domyślna wartość musi być stałym wyrażeniem, a nie na przykład zmienną, członkiem klasy czy wywołaniem funkcji

Czy to chcesz zrobić ma sens? Może ma, nie spotkałem się z czymś takim ani nie bardzo wiem czemu miałoby to służyć - wartość domyślna jest stała, nie powinna zależeć od innych warunków - jeśli zależy to należy ją przekazać. Do operacji na zmiennych mamy ciało funkcji a nie parametry.
kiler129
Cytat(everth @ 29.08.2010, 04:07:15 ) *
Manual i cytat

Czy to chcesz zrobić ma sens? Może ma, nie spotkałem się z czymś takim ani nie bardzo wiem czemu miałoby to służyć - wartość domyślna jest stała, nie powinna zależeć od innych warunków - jeśli zależy to należy ją przekazać. Do operacji na zmiennych mamy ciało funkcji a nie parametry.


Niestety natrafiłem na sytuację gdzie jest to przydatne. Pokazuję to niżej:
  1. define("APATH", "/Users/Grzegorz/Sites/uCMS");
  2.  
  3. foo($safe_dir=APATH."/download") { ... }


Co prawda problem da się obejść tak:
  1. define("APATH", "/Users/Grzegorz/Sites/uCMS");
  2. define("SAFE_BROWSE_PATH", APATH."/download"); //path where user can safety view without violating security
  3.  
  4. foo($safe_dir=SAFE_BROWSE_PATH) { ... }



To że nie powinna od niczego zależeć i może być z całą definicją funkcji uznana jako stała to wiem ;] Tyle że połączenie nawet 2 stringów ("foo"."bar") skutkuje błędem.
michaJlS
Cytat(kiler129 @ 29.08.2010, 03:35:30 ) *
  1. <?php
  2. function foobar($a = TEST) { $a .= "def"; print($a); } //Wynik: abcdef
  3. ?>


Ale w żaden sposób nie kojarzy się to z dobrym stylem pisania i przejrzystością kodu. Czy w PHP niemożliwe jest zdefiniowanie argumentu domyślnego funkcji składającego się z 2 części?


  1. function foobar($a=null){
  2. if(is_null($a)) $a = TEST.'def';
  3. // ...
  4. }


to co chcesz osiągnąć, to jeszcze "gorszy" styl pisania, bo w ogóle niepoprawny;) Ty to źle nazywasz, stąd ci się wydaje, że tak powinno się dać. To nie jest definiowanie domyślnego argumentu składającego się z dwóch części. To jest po prostu definiowanie domyślnego argumentu jako wynik pewnej operacji, a to jak sam wiesz jest zabronione.
tehaha
Cytat(kiler129 @ 29.08.2010, 04:49:39 ) *
Niestety natrafiłem na sytuację gdzie jest to przydatne. Pokazuję to niżej:
  1. define("APATH", "/Users/Grzegorz/Sites/uCMS");
  2.  
  3. foo($safe_dir=APATH."/download") { ... }


Co prawda problem da się obejść tak:
  1. define("APATH", "/Users/Grzegorz/Sites/uCMS");
  2. define("SAFE_BROWSE_PATH", APATH."/download"); //path where user can safety view without violating security
  3.  
  4. foo($safe_dir=SAFE_BROWSE_PATH) { ... }



To że nie powinna od niczego zależeć i może być z całą definicją funkcji uznana jako stała to wiem ;] Tyle że połączenie nawet 2 stringów ("foo"."bar") skutkuje błędem.


Oba przypadki są jak dla mnie pozbawione sensu i są złą praktyką, przecież jeżeli przy przekazywaniu do funkcji będziesz składał sobie zmienną to ta funkcja jest kompletnie nieelastyczna, powinieneś to tak rozwiązać:
  1. define("APATH", "/Users/Grzegorz/Sites/uCMS");
  2.  
  3. $path = APATH."/download";
  4. foo($path);

funkcja przyjmuje jakieś parametry i wykonuje na nich operacje, jeżeli jakieś parametry mają wartość domyślną to ją ustawiasz, ale jeżeli te wartości trzeba poskładać to robisz to przed funkcją
everth
To raczej jest ograniczenie Zend Engine - PHP pozwala przecież na osadzanie stałych jako parametrów domyślnych - one nie zmieniają wartości. Logicznie rzecz biorąc złączenie dwóch stałych stringów również daje stały ciąg tekstowy. Chyba że tu chodzi np. o operacje na liczbach zmiennoprzecinkowych (gdzie wynik już nie do końca jest stały).
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.