Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa i jej funkcja z return
Forum PHP.pl > Forum > PHP
Szymciosek
Mam klasę:
  1. class Test
  2. {
  3. public $zmienna = array(...);
  4. public function zwroc()
  5. {
  6. return $this->zmienna;
  7. }
  8. }


Którą odpalam w osobnym pliku:
  1. include...
  2. $Test = new Test();
  3. $Test->zwroc()...


i teraz pytanie jak za pomocą tego $Test->zwroc() odnieść się do danego wpisu z tablicy ?
Normalnie zrobiłbym to na tablicy w nawiasach kwadratowych.

A może zrobić po prostu:
  1. include...
  2. $Test = new Test();
  3. $zmienna = $Test->zwroc()...

i wtedy w $zmienna mam cały array ?

Jak jest prawidłowo ?
markonix
Możesz przekazać indeks jako argument funkcji zwroc.
Możesz też zwrócić tablicę i przypisać ją do zmiennej i operować na niej w normalny sposób.
bastard13
Po pierwsze Twoja zmienna powinna być prywatna (http://bit.ly/IBVfCS). Jeżeli jest publiczna, to nie potrzebna Ci żadna metoda do pobierania jej:P
A co do wyciągania pojedynczej wartości to rozwiązanie, które podał Ci markonix jest idealne rzn. przekazywanie klucza jako parametru. Może być opcjonalny i w przypadku jego braku zwracasz całą tablicę:
  1. public function zwroc($key = null)
  2. {
  3. if (is_null($key)
  4. return $this->zmienna;
  5.  
  6. if (!array_key_exists($key, $this->zmienna))
  7. throw new OutOfRangeException('key doesn\'t exists.');
  8.  
  9. return $this->zmienna[$key];
  10. }
hind
nie polecam tego rozwiązania powyrzszego...
osobiście zrobił bym 2 metody zwroc() i zwrocWartosc($klucz=null). Dzięki temu masz jakąś tam przewidywalność zwracanych danych (przypadkowe podanie $klucz = null spowoduje zrócenie nieporządanych danych)
Szymciosek
Cytat(bastard13 @ 9.05.2012, 08:05:01 ) *
Po pierwsze Twoja zmienna powinna być prywatna (http://bit.ly/IBVfCS). Jeżeli jest publiczna, to nie potrzebna Ci żadna metoda do pobierania jej:P
A co do wyciągania pojedynczej wartości to rozwiązanie, które podał Ci markonix jest idealne rzn. przekazywanie klucza jako parametru. Może być opcjonalny i w przypadku jego braku zwracasz całą tablicę:
  1. public function zwroc($key = null)
  2. {
  3. if (is_null($key)
  4. return $this->zmienna;
  5.  
  6. if (!array_key_exists($key, $this->zmienna))
  7. throw new OutOfRangeException('key doesn\'t exists.');
  8.  
  9. return $this->zmienna[$key];
  10. }


  1. <?php
  2.  
  3. class ReadFile
  4. {
  5. private $file;
  6.  
  7. public function __construct()
  8. {
  9. $this->read();
  10. }
  11.  
  12. private function read()
  13. {
  14. if (file_exists('wpisy.txt'))
  15. {
  16. $file = file('wpisy.txt');
  17. //echo $file[0];
  18. $this->getContent(0);
  19. }
  20. }
  21.  
  22. public function getContent($key = null)
  23. {
  24. if (is_null($key))
  25. return $this->file;
  26.  
  27. if (!array_key_exists($key, $this->file))
  28. throw new OutOfRangeException('Key doesn\'n exist.');
  29.  
  30. return $this->file[$key];
  31. }
  32. }
  33.  
  34. ?>


Zwraca mi 2 błędy:

Kod
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in C:\AppServ\www\PHP\Guest book\ReadFile.class.php on line 27

Fatal error: Uncaught exception 'OutOfRangeException' with message 'Key doesn'n exist.' in C:\AppServ\www\PHP\Guest book\ReadFile.class.php:28 Stack trace: #0 C:\AppServ\www\PHP\Guest book\ReadFile.class.php(18): ReadFile->getContent(0) #1 C:\AppServ\www\PHP\Guest book\ReadFile.class.php(9): ReadFile->read() #2 C:\AppServ\www\PHP\Guest book\index.php(13): ReadFile->__construct() #3 {main} thrown in C:\AppServ\www\PHP\Guest book\ReadFile.class.php on line 28


Do drugiego błędu chyba muszę zrobić klasę, która to wychwyci czy coś ?
Dodam, że array mam w postaci array('wpis1', 'wpis2'), a na przykładach z manuala widzę tablicę asocjacyjną

Edit:
Wyczytałem, że to nie typ tablicy, ale dalej nie wiem czemu nie działa...

Edit2:
Panika paniką, błąd znaleziony smile.gif
$file = file('wpisy.txt'); ---> $this->file...

------------------------------------------------------------------------------------------------------

Cytat(hind @ 9.05.2012, 08:29:40 ) *
nie polecam tego rozwiązania powyrzszego...
osobiście zrobił bym 2 metody zwroc() i zwrocWartosc($klucz=null). Dzięki temu masz jakąś tam przewidywalność zwracanych danych (przypadkowe podanie $klucz = null spowoduje zrócenie nieporządanych danych)

2 metody skoro powyższe właśnie chyba ma sprawdzać kiedy klucz jest podany to zwraca dany key, a jeśli go nie ma to chyba ma zwrócić całą tablicę ?
BlackDante
a nie lepiej do czegoś takiego użyć metody magicznej get ? np.

  1. class Test{
  2. private $zmienna = array();
  3. public function __get($key)
  4. {
  5. if(array_key_exists($key,$this->zmienna))
  6. {
  7. return $this->zmienna[$key];
  8. }
  9. else
  10. {
  11. return false;
  12. }
  13. }
  14. }


Wtedy do wartości tablicy odwołujemy się za pomocą zwykłego:

  1. $test = new Test();
  2. $value = $test->klucz; // zwraca $test->zmienna['klucz']


według mnie jest to o wiele wygodniejsza metoda jeżeli chcesz wszystkie zmienne trzymać w tablicy.
Crozin
Cytat
2 metody skoro powyższe właśnie chyba ma sprawdzać kiedy klucz jest podany to zwraca dany key, a jeśli go nie ma to chyba ma zwrócić całą tablicę ?
Powinny być dwie metody w celu wyselekcjonowania ich odmiennych zachowań - jedna zwraca pojedynczy element tablicy (get($key)), druga całą tablicę (getAll()). Kod będzie wtedy bardziej czytelny i jednoznaczny.

@BlackDante: Użycie __get() byłoby błędne. Masz metodę to używaj tego jak metody. Będziesz mieć wsparcie ze strony narzędzi do dokumentacji kodu oraz IDE, a kod będzie mieć w ogóle jakikolwiek sens. A w przypadku gdy nie istnieje dany klucz w tablicy trzeba wyrzucić wyjątek. W tej chwili Twoja propozycja jest chyba najbardziej podatną na błędy (trudne w wykryciu) z możliwych.
Szymciosek
Czyli jak w końcu wg was powinno to wyglądać ?

  1. class Name
  2. {
  3. public function __construct() { //instrukcje }
  4.  
  5. public function getArray($key)
  6. {
  7. if (array_key_exists($key, $array))
  8. {
  9. return $array[$key];
  10. } else {
  11. //error
  12. }
  13. }
  14.  
  15. public function getAllArray()
  16. {
  17. return $array;
  18. }
  19. }


Czy coś takiego ? I teraz w zależności od tego czy chcę zwrócić sobie całą tablicę czy np tylko piąty wpis w tablicy to uruchamiam odpowiednią metodę ?
Crozin
  1. class MyClass {
  2. private $myArray = array();
  3.  
  4. public function get($key) {
  5. if (!array_key_exists($key, $this->myArray) {
  6. throw new OutOfBoundsException('...');
  7. }
  8.  
  9. return $this->myArray[$key];
  10. }
  11.  
  12. public function getAll() {
  13. return $this->myArray;
  14. }
  15. }
Szymciosek
Możesz mi jeszcze odpowiedzieć do wcześniejszego, miejsce w którym rzucam wyjątkiem zwracało mi błąd:

Fatal error: Uncaught exception 'OutOfRangeException' with message 'Key doesn'n exist.' in C:\AppServ\www\PHP\Guest book\ReadFile.class.php:28 Stack trace: #0 C:\AppServ\www\PHP\Guest book\ReadFile.class.php(18): ReadFile->getContent(0) #1 C:\AppServ\www\PHP\Guest book\ReadFile.class.php(9): ReadFile->read() #2 C:\AppServ\www\PHP\Guest book\index.php(13): ReadFile->__construct() #3 {main} thrown in C:\AppServ\www\PHP\Guest book\ReadFile.class.php on line 28

Czym to jest spowodowane ? Muszę wychwycić ten wyjątek poprzez try/catch ?
Crozin
Tak, jeżeli możesz coś sensownego zrobić z tym wyjątkiem to powinieneś go przechwycić. Ale mogłeś to przecież samemu sprawdzić.
Szymciosek
Mogłem, chociaż pisałem o tym wcześniej i konkretnej odpowiedzi nie otrzymałem.
Co do wyjątku OutOfBoundsException to może on być rzucany wtedy, kiedy wartość nie jest poprawnym kluczem. W tym przypadku z tego co widzę to jeśli taki klucz nie istnieje to właśnie wtedy, a gdzie mogę wyczytać kiedy i jakich kluczy używać ? Manual manualem, ale może jest to na przykładach gdzieś pokazane ?
Crozin
Cytat
gdzie mogę wyczytać kiedy i jakich kluczy używać ?
To czy dany klucz istnieje w danej tablicy jest znane dopiero w czasie wykonywania (ang. run-time) skryptu, tak więc będziesz musiał mieć osobną metodę, zwracającą informację o tym czy dany klucz istnieje, przykładowo:
  1. public function contains($key) {
  2. return array_key_exists($key, $this->myArray);
  3. }
Jeżeli chciałbyś mieć pewność istnienia danego elementu już w czasie "kompilacji" (ang. compile-time) skorzystaj z obiektu zamiast tablicy.
Szymciosek
Kurcze, teraz zobaczyłem, że źle napisałem, nie miało być których klucz a których wyjątków gdzie i kiedy tongue.gif
Przepraszam za pomyłkę
Crozin
Wyjątków używasz wszędzie tam gdzie masz do zasygnalizowanie wystąpienie chociażby najmniejszego błędu. Listę (dosyć ubogą i słabo opisaną) standardowych wyjątków i ich podział (drzewo hierarchii) masz tutaj: http://php.net/manual/en/spl.exceptions.php. W miarę możliwości powinieneś korzystać z jak najbardziej specyficznego wyjątku, ale jeżeli do danej sytuacji brakuje jakiegoś odpowiedniego możesz śmiało utworzyć własny.
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.