Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy dobrą praktyką jest podanie funkcji czego dokładnie się spodziewamy?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Szymciosek
Witam, tak jak w temacie

czy lepiej jest napisać:
  1. public function update($_query = '', $_values = array())
żeby podać od razu, że query to string, a values to array

czy lepiej po prostu
  1. public function update($_query, $_values)


?

No i najważniejsze: Dlaczego wg. Ciebie tak, a nie inaczej?
CuteOne
Lepiej rzutować typy
  1. public function update($_query, array $_values=array()) {
  2.  
  3. if(!is_string($_query)) {
  4. throw new XYZ_Exception('query musi byc stringiem);
  5. }
  6. }

wtedy masz pewność, że parametry są takiego typu jaki oczekujesz

np.
  1. public function update(\Obiekt\Interface $obiekt, array $array) {}
  2.  
  3. $this->update('aha', 'oho');
mstraczkowski
Dzięki temu, że PHP wprowadził type hinting
Można mniej więcej doprowadzić w tym języku do wymuszonego silnego typowania - ale to raczej sztuka dla sztuki wink.gif

Odpowiadając na twoje pytanie:

Nie ma to jakiegokolwiek znaczenia

Poza tym, implementując taki kod jak pokazałeś nie sądzę, abyś był zadowolony z faktu, że twoją metodę będzie można wykonać bez parametrów (gdyż obu nadałeś domyślną wartość)

  1. $object->update();

PHP jest językiem słabo-typowanym, więc nawet jeżeli podasz mu tą domyślną wartość jako string.
To mu to nie przeszkodzi, aby upchnąć tam np arraya lub integera, bez żadnego błędu.

Przypisywanie domyślnych wartości służy tylko do definiowania opcjonalnych danych
Takich, które mogą zostać podane (aby przykładowo rozwinąć funkcjonalność danej metody lub zmienić trochę jej dotychczasowe działanie), ale nie muszą

Jeżeli zależy ci na tym, aby kontrolować to co znalazło się w metodzie jako parametr to musisz sobie samemu tworzyć obsługę silnego typowania rzucając przykładowo wyjątek gdy parametr posiada inny typ niż się spodziewasz - tak jak pokazał poprzednik.

Jeżeli korzystasz z przekazywania obiektów między metodami, możesz korzystać z mechanizmu type-hintingu, który wymusza, aby parametr był instancja podanej klasy - to również pokazał poprzednik

Array jest dosyć fajnym typem, bo jednocześnie jest nazwą typu (array) oraz możemy używać array w type hintingu bez zbędnego kombinowania i wtedy mamy pewność, że parametr będzie tablicą, bo w przeciwnym wypadku PHP rzuci fatal error - to także pokazał ci mój poprzednik.

Cytat
Catchable fatal error: Argument 1 passed to a::b() must be of the type array, integer given, called in /path/to/file.php on line 35 and defined in /path/to/file.php on line 29

Zagłębiając się w genezę to PHP najprawdopodobniej zapożyczył swój type hinting z Javy, gdzie jest on używany na porządku dziennym:

Kod
public static void nPrintln(String message, int n) {
    for (int i = 0; i < n; i++)
        System.out.println(message);
}

Podobnie jest zresztą w C#, tylko że zarówno w nim jak i w javie (języki obiektowe, silno-typowane), możemy korzystać z type hintingu do oznaczania wszystkich typów np. (int, string), gdyż tam są one obiektami.

Natomiast w PHP int oraz string, są zwykłymi typami prostymi, inaczej zwanymi typami skalarnymi (z stąd także nazwa funkcji is_scalar), przez co nie można ich użyć w zaimplementowanym type hintingu, o czym informuje nas dokumentacja.

Cytat
Type hints can not be used with scalar types such as int or string.

Type hinting w php jest domyślnie dozwolony tylko dla tablic oraz obiektów - są to typy złożone

Jeżeli jesteś zainteresowany tym tematem to możesz sobie poczytać o przykładowej implementacji silnego typowania PHP
(Sztuka dla sztuki, ale temat bardzo ciekawy - bardziej w celach teoretycznych niż praktycznych)

http://php.webtutor.pl/pl/2011/03/23/silne...-w-php-czesc-i/
http://php.webtutor.pl/pl/2011/04/12/silne...czalne-obiekty/

Ale wracając do głównego tematu:

Być może chodzi ci o to, aby poinformować drugiego programistę o tym, czego ta metoda się spodziewa
Aby to zrobić możesz użyć bloków PHPDoc i atrybutów/tagów @param

Przykładowo:

  1. /**
  2.  * @access public
  3.  * @param string $value Value to validate
  4.  * @param RuleInterface $rule Validation rule
  5.  * @return boolean True or false
  6.  */
  7. public function validate($value, RuleInterface $rule)
  8. {
  9. // doing something
  10. }
Szymciosek
W sumie chyba źle napisałem w swoim pierwszym poście, a miałem właśnie na myśli żeby podać do funkcji tylko dane konkretnego typu. Tak jak pisałeś np. array $_values -> mówi o tym, że zmienna $_values musi być typu array.

O dokumentowaniu kodu też wiem, ale to już inna sprawa.
pyro
Najpierw należy się zapoznać czym są parametry wymagane, a opcjonalne, bo z wymuszaniem typu to nie ma nic wspólnego.
Szymciosek
Opcjonalny to taki jaki pokazałem w pierwszym poście czyli

  1. function ($wymagany, $opcjonalny = null) { }


W powyższym przypadku musimy podać $wymagany, a $opcjonalny mimo wszystko przyjmuje null.

Czym jest parametr wymagany? Czy to jest to, co podałem powyżej określając, który parametr ma wartość domyślną (jest opcjonalny) czy jeszcze coś innego?
pyro
Tak, te parametry co podałeś to rzeczywiście kolejno wymagany i opcjonalny, ale mi raczej chodziło o to, żeby się zapoznać jakie jest znaczenie takich parametrów i dlaczego chcieć za pomocą parametrów opcjonalnych podpowiadać typy danych to raczej zabawna rzecz. Poziomowo to jest coś z serii "Czy nie mogę po prostu w każdej klasie jaką robię zadeklarowac wszystkich właściwości i metod jako statycznych i ich tak używać" smile.gif ?
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.