Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przeciązenie funkcji
Forum PHP.pl > Forum > PHP
Black-Berry
Czy można w PHP wykonać przeciążenie funkcji o tej samej ilości argumentów? Coś w stylu...

  1. <?php
  2. function wykonaj( $integer )
  3. {
  4.  // funkcja zawiera argument liczbowy...
  5. }
  6.  
  7. function wykonaj( $string )
  8. {
  9.  // funkcja zawiera argument typu string...
  10. }
  11. ?>
.radex
możesz posprawdzać sobie w funkcji (jednej) typ argumenta za pomoca is_string itp. problem będzie, gdy kolejne argumenty beda zupelnie inne w przypadku innego typu pierwszej zmiennej (np. rozna ilosc argumentow), ale na pewno jest to wykonalne.



może jest jakiś prostszy sposób.

EDIT:

Zobacz to: http://pl.php.net/manual/pl/function.overload.php
Snowak
To co podałeś tyczy się klas.

Co do tematu - nie da się bo PHP za bardzo nie rozróżnia typów. Np. 1 może być cyfrą, ale i zarówno napisem '1' i wartością true.
.radex
is_string, is_float itd. potrafi rozróżnić typ, zobacz do manuala winksmiley.jpg
em1X
nie, bo php ciągle kuleje i bardzo daleko mu do porządnego, hermetycznego języka obiektowego
GrayHat
@em1X: nie do końca się z tobą zgodzę.

Jeżeli przekażemy do PHP jakąś zmienną o nieokreślonym typie to PHP przypisze mu typ najbardziej mu pasujący winksmiley.jpg
Od wersji 5.x mamy w PHP rzutowanie typów, które działa całkiem nieźle. Tylko projektanci aplikacji zapominają o nim...

np:

  1. <?php
  2. $i = 1;
  3. ?>


zwróci dwa razy true, bo 1 jest liczba, ale nie określiliśmy jej typu więc jest także prawdą.

A spróbuj teraz:

  1. <?php
  2. $i = (bool)1;
  3. ?>


W tym wypadku rezultatem działania będzie false, true gdyż wartość $i nie jest liczbą.

Pozdrawiam
em1X
Nic nowego nie przekazałeś. Wychodzi z tego tyle, że możesz sobie w jednej funkcji tworzyć dwa bloki niby dwóch różnych funkcji. Ale ile to ma wspólnego z przeciążaniem? wstydnis.gif

I tak btw. php jest strasznie z tym denerwujące, sobie wymyślili, że jedna zmienna może być jednocześnie liczbą i booleanem. A potem podstawiasz co innego i znowu masz inny typ. A potem z bool'a może Ci się zrobić null, a to 0 a to false. Marzę o chwili kiedy w końcu wprowadzą jakąś hermetyzację, bo samo:

  1. <?php
  2. public function test(Object o) { }
  3. ?>


to jednak za mało. Kiedy w końcu integer będzie integerem, a bool boolem.
Snowak
A jak dla mnie to właśnie brak podziału na typy to najlepsze co może być. Ma się pełną swobodę a to wcale nie stwarza ŻADNYCH problemów. Jedynie pedanci co się uczyli programować w Delphi i C++ i teraz nie mogą się przestawić, narzekają -,- Pewnie wg. Ciebie dzięki temu zwiększyło by się bezpieczeństwo aplikacji, razem z SQL injection... Ale wystarczy umieć logicznie myśleć i można się przed tym bez problemów zabezpieczyć.
Nie dobijaj mnie, człowieku :S
mike
Cytat(Snowak @ 3.02.2008, 00:25:22 ) *
A jak dla mnie to właśnie brak podziału na typy to najlepsze co może być.
Młody jesteś, jeszcze rośniesz tongue.gif

Brak typowania zmiennych to porażka. Największą konsekwencją tego jest brak polimorfizmu w PHP. Co do projektantów nie umiejących się przestawić. Piszę w PHP już od pięciu lat, od dwóch piszę w Java i uwierz mi, że dopóki w PHP nie pojawi się przynajmniej część normalnych rzeczy dopóty będzie to zabawka.

~GrayHat rzutowanie to nie jest rzecz wprowadzona w PHP5. Było już wcześniej.
em1X
Cytat(Snowak @ 3.02.2008, 00:25:22 ) *
A jak dla mnie to właśnie brak podziału na typy to najlepsze co może być. Ma się pełną swobodę a to wcale nie stwarza ŻADNYCH problemów. Jedynie pedanci co się uczyli programować w Delphi i C++ i teraz nie mogą się przestawić, narzekają -,- Pewnie wg. Ciebie dzięki temu zwiększyło by się bezpieczeństwo aplikacji, razem z SQL injection... Ale wystarczy umieć logicznie myśleć i można się przed tym bez problemów zabezpieczyć.
Nie dobijaj mnie, człowieku :S


Na brak logicznego myślenia nie narzekam. Z takim podejściem od razu cofnij się do assemblera, bo przecież skoro z logiką nie masz problemów to pisanie w nim będzie dla Ciebie wygodne i w ogóle. Tak poza tym nigdy nie pisałem w Delphi, natomiast C++ nie lubię. Piszę za to bardzo dużo w Javie. To jest dla mnie język numer 1 jeżeli chodzi o obiektowość i stawiam go na najwyższej półce porównując z nim inne języki. Twój post natomiast świadczy o Twoim programistycznym poziomie skoro wolisz co funkcję pisać kolejne linie walidowania danych:

  1. <?php
  2. public function query($intIlosc)
  3. {
  4.  if (!is_numeric($intIlosc)) die('blad');
  5. }
  6. ?>


a nie widzieć logiki takiego rozwiązania
  1. <?php
  2. public function query(int $ilosc)
  3. {
  4.  
  5. }
  6. ?>


które by po prostu nie zezwoliło na cokolwiek innego poza liczbą całkowitą i wyrzuciło parse error.
.radex
dobrze by było, gdyby było można ustawić typ zmiennej, lub nie ustawić (uniwersalny). Łącząc atuty obu sposobów dało by to dużo więcej możliwości. Tylko ciekawe jak by to się sprawdzało technologicznie.
Black-Berry
z tego co wiem to PHP sam dobiera sobie typy, tzn jeśli przypiszemy do tej zmiennej 1 to w pamieci bezie ona przechowywana jako int. Z tego względu chyba nie ma technologicznych przesłanek aby nie móc wymuszać na zmiennej typu. Poprostu algorytm omijałby blok gdzie szuka typu.

A co do PHP jako zabawki... to słyszałem gdzieś, że świat dąży do języków typu "D", kolejnej generacji po "C" (Chyba na wykładach z inżynierii oprogramowania to profesor mówił ale nie jestem pewien bo nie za często na nich bywałwem smile.gif ). Dążenie to ma służyć właśnie wyeliminowaniu typów z języków programowania.

Myślę, że jest całkiem nieźle bo działa tak jak powinno

  1. <?php
  2. public function get_account_type( $a_id )
  3. {
  4. if( is_string($a_id) )
  5. {
  6. $this->db_driver()->query( "SELECT * FROM ".database_prefix()."edc_account_types_main WHERE name='".$a_id."'" );
  7. $row = $this->db_driver()->fetch_row();
  8. return $row;
  9. }else if( is_int($a_id) ){
  10. $this->db_driver()->query( "SELECT * FROM ".database_prefix()."edc_account_types_main WHERE id=".$a_id."" );
  11. $row = $this->db_driver()->fetch_row();
  12. return $row;
  13. }else{
  14. return false;
  15. }
  16. }
  17. ?>
Kocurro
Na phpClasses jest hack TypeHinting ... który fajnie emuluje podstawową hermetyzację. Połączyłem go z innego hackami z phpClasses i mam w pełni gotową emulację hermetyzacji, której jedyne czego brakuje to wartości domyślne.

Ogólnie - przejrzyjcie phpClasses tam jest hack pozwalający symulować przeciążenie smile.gif trzeba go tylko odpowiednio zaadoptować smile.gif
em1X
Cytat(radex_p @ 3.02.2008, 10:24:22 ) *
dobrze by było, gdyby było można ustawić typ zmiennej


w sumie jest sposób wstydnis.gif (wymaga php5)
  1. <?php
  2. class Variable
  3. {
  4. protected $__props = array();
  5.  
  6. public function __set($var, $new) {
  7.  
  8. if (array_key_exists($var, $this->__props))
  9. {
  10. if (gettype($new) != gettype($this->__props[$var]))
  11. trigger_error('Wrong type ('.gettype($new).'): '.gettype($this->__props[$var]) . ' expected.', E_USER_ERROR);
  12. }
  13.  
  14. $this->__props[$var] = $new;
  15. }
  16.  
  17. public function __get($var)
  18. {
  19. if (array_key_exists($var, $this->__props))
  20. return $this->__props[$var];
  21. }
  22. }
  23.  
  24. $test = new Variable;
  25.  
  26. $test->zmienna = "test";
  27. $test->zmienna = array();
  28.  
  29. print $test->zmienna;
  30. ?>
Black-Berry
chciałem tylko dodać, że przy funkcji która bada typ trzeba jednak czasem stosować rzutowanie typu.
.radex
~em1X - zawsze coś, ale:

  1. <?php
  2. $test = new Variable;
  3.  
  4. $test->zmienna = "test";
  5. $test->zmienna = array();
  6. ?>


to jednak nie to samo co powiedzmy:

Kod
int $zmienna = 6; // typ int
$zmienna2 = 'abc'; //typ uniwersalny
em1X
Cytat(radex_p @ 19.02.2008, 09:29:59 ) *
to jednak nie to samo


no raczej dry.gif podałem tylko przykład.
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.