Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Stała+string jako argument domyślny funkcji, ... czy to możliwe?
kiler129
post 29.08.2010, 02:35:30
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


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?


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
everth
post 29.08.2010, 03:07:15
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
kiler129
post 29.08.2010, 03:49:39
Post #3





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


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.

Ten post edytował kiler129 29.08.2010, 03:50:09


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
michaJlS
post 29.08.2010, 12:40:32
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 9
Dołączył: 21.05.2004
Skąd: Glogau/Breslau

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


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.

Ten post edytował michaJlS 29.08.2010, 12:40:59
Go to the top of the page
+Quote Post
tehaha
post 29.08.2010, 12:57:58
Post #5





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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ą

Ten post edytował tehaha 29.08.2010, 12:59:23
Go to the top of the page
+Quote Post
everth
post 29.08.2010, 14:20:56
Post #6





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


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


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
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: 18.07.2025 - 13:34