Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Pierwsza Klasa
Grafnastyk
post 9.12.2017, 15:15:58
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 25.08.2017

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


Witam, czy mógłby mi ktoś wyjaśnić dlaczego moja funkcja use_monster zwraca tylko pierwszą zmienną? Domyślam się, że błąd jest banalny, ale nigdzie nie mogę znaleźć rozwiązania a błędu nie wyrzuca mi żadnego.

  1. <?php
  2.  
  3. class Monster
  4. {
  5. public
  6. $name,
  7. $hp,
  8. $def,
  9. $atk;
  10.  
  11. public function Create_monster($m_name, $m_hp, $m_def, $m_atk)
  12. {
  13. $this->name = $m_name;
  14. $this->hp = $m_hp;
  15. $this->def = $m_def;
  16. $this->atk = $m_atk;
  17.  
  18. }
  19.  
  20. public function use_monster()
  21. {
  22. return $this->name;
  23. return $this->hp;
  24. return $this->def;
  25. return $this->atk;
  26.  
  27.  
  28. }
  29.  
  30. }
  31.  
  32. $monster1 = new Monster;
  33.  
  34. $monster1->Create_monster('Troll',100,100,100);
  35.  
  36. echo $monster1->use_monster();
Go to the top of the page
+Quote Post
markonix
post 9.12.2017, 15:19:12
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


A jak sobie wyobrażasz, żeby zwróciło Ci jednocześnie kilka wartości? Po przecinku?


--------------------
Go to the top of the page
+Quote Post
viking
post 9.12.2017, 15:35:00
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


return wychodzi natychmiast z metody. Najlepiej zwróć tablicę.
Natomiast poczytaj trochę o PSR i zdecyduj się na jedno nazewnictwo, najlepiej camelCase.


--------------------
Go to the top of the page
+Quote Post
leonpro778
post 9.12.2017, 21:44:45
Post #4





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Nazewnictwo to aż nie taki wielki problem (chociaż też są przyjęte pewne standardy). Zacznij lepiej od zapamiętywania pewnych przyjętych "nawyków" przy programowaniu obiektowym.

1. Do każdego pola powinna być przypisana metoda GET i SET.
2. Pola metody powinny być prywatne a dostęp do nich (poprzez metody GET i SET) niech będzie publiczne.
3.Metodę Create_monster wrzuć w konstruktor.
4. Odnośnie nazewnictwa:
Nazwy pól, czyli hp, att nazywamy z _ na początku. Czyli $this->_mp
Nazwy metod, czyli przykładowo jakis GET. Pierwsza litera jest mała, czyli getHp()
Nazwa obiektu z dużej litery, czyli tak jak masz u siebie class Monster

I tyle jak na początek :-)

Odnośnie problemu - dostęp do tych danych, pobieraj wtedy kiedy ich potrzebujesz. I niestety nie możesz zrobić tego cztery razy pisząc return :-)
Go to the top of the page
+Quote Post
Pyton_000
post 9.12.2017, 22:02:44
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Torchę popłynąłeś...

1. Gettery i Settery (bo tak to się nawzyaw) nie są wymagane, a czasami wręcz nie potrzebne.
2. _ się nie używa do określania widoczności properties.

Odnoścnie "nazewnictwa kodu" oraz tego co i jak polecam zapoznać się z
http://www.php-fig.org/psr/psr-1/
http://www.php-fig.org/psr/psr-2/
Go to the top of the page
+Quote Post
Boshi
post 10.12.2017, 01:32:08
Post #6





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


"Troche.." on zatonął.

prefixów w postaci kresek się nie używa, akcesory nie są potrzebne zawsze, przykład Value obiect..
Go to the top of the page
+Quote Post
leonpro778
post 10.12.2017, 08:51:07
Post #7





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Tak trochę to nie ja "popłynąłem" co WY mnie nie zrozumieliście.

Po pierwsze:
Nic nie pisałem o GETTERACH i SETTERACH. To, że użyłem nazwy GET i SET wynika tylko właśnie z tego, że w jakiś sposób trzeba zmienną w pewien sposób "zmodyfikować" i do tego służy metoda, którą nazwałem sobie SET (popatrzcie na przykład jaki podałem w nazewnictwie). Mój błąd, że nie napisałem poprawnie.

Po drugie:
Prefiks w postaci _ przed zmienną ma określać WIDOCZNOŚĆquestionmark.gif Gdzie ja tak napisałem? Napisałem tylko, że pola powinny być prywatne a metody publiczne. Oczywiście taki znak przed zmienną pomaga w późniejszej identyfikacji zmiennej ale nigdzie nie napisałem, że _ zmienia widoczność.

Ten post edytował leonpro778 10.12.2017, 09:18:37
Go to the top of the page
+Quote Post
viking
post 10.12.2017, 10:58:42
Post #8





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Czyli właśnie setter.
_ już od wielu lat się nie używa. I dobrze pyton napisał choć może skrótowo.


--------------------
Go to the top of the page
+Quote Post
markuz
post 10.12.2017, 13:02:20
Post #9





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


  1. <?php
  2.  
  3. namespace Game;
  4.  
  5. class Monster
  6. {
  7. private $name;
  8. private $attack;
  9. private $defense;
  10. private $life;
  11.  
  12. public function __construct(string $name, int $attack, int $defense, int $life)
  13. {
  14. $this->name = $name;
  15. $this->attack = $attack;
  16. $this->defense = $defense;
  17. $this->life = $life;
  18. }
  19.  
  20. public function getName(): string
  21. {
  22. return $this->name;
  23. }
  24.  
  25. public function getAttack(): int
  26. {
  27. return $this->attack;
  28. }
  29.  
  30. public function getDefense(): int
  31. {
  32. return $this->defense;
  33. }
  34.  
  35. public function getLife(): int
  36. {
  37. return $this->life;
  38. }
  39. }


1. Obiekt tworzymy przez konstruktor a nie dodatkową metode.
2. Używamy normalnych nazw, bez żadnych skrótów które mogą wprowadzić w błąd.
3. Domyślnie każda właściwość powinna być prywatna

Ten post edytował markuz 10.12.2017, 13:05:08


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post 10.12.2017, 13:14:36
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Cytat(leonpro778 @ 10.12.2017, 08:51:07 ) *
Tak trochę to nie ja "popłynąłem" co WY mnie nie zrozumieliście.

Poczytałeś o dobrych nawykach, ale nie doczytałeś, że trzeba je stosować z głową. Getterów i setterów się używa tylko tam, gdzie są potrzebne. A z tym dolnym podkreśleniem to niektórzy mają taką zasadę, ale moim zdaniem jest idiotyczna. A już mówić o niej jak o jakiejś prawdzie objawionej to jakiś kosmos.

Ten post edytował SmokAnalog 10.12.2017, 13:15:13
Go to the top of the page
+Quote Post
leonpro778
post 10.12.2017, 14:05:56
Post #11





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Cytat(SmokAnalog @ 10.12.2017, 13:14:36 ) *
Poczytałeś o dobrych nawykach, ale nie doczytałeś, że trzeba je stosować z głową.

Co jest błędnego w moim rozumowaniu?

Cytat(SmokAnalog @ 10.12.2017, 13:14:36 ) *
Getterów i setterów się używa tylko tam, gdzie są potrzebne.

Wyjaśnijmy jedno, czym dla Ciebie jest:
getAttack() {
return $this->_att;
}

Cytat(SmokAnalog @ 10.12.2017, 13:14:36 ) *
A z tym dolnym podkreśleniem to niektórzy mają taką zasadę, ale moim zdaniem jest idiotyczna.

Framework Zend - tam długo stosowali taką zasadę. Czy ja wiem czy jest to taka idiotyczna zasada?questionmark.gif

Cytat(SmokAnalog @ 10.12.2017, 13:14:36 ) *
A już mówić o niej jak o jakiejś prawdzie objawionej to jakiś kosmos.

Heh, czy ja pisałem o jakiejś prawdzie objawionej?
Go to the top of the page
+Quote Post
nospor
post 10.12.2017, 14:21:05
Post #12





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Framework Zend - tam długo stosowali taką zasadę. Czy ja wiem czy jest to taka idiotyczna zasada?
Skolo klucz z twojej wypowiedzi: STOSOWALI - czas przeszly
Kiedys ludzie przez wieki zyli w jaskiniach....

Teraz mamy PSR ktore standaryzuje pewne rzeczy, ale zawsze znajdzie sie taki ktos jak ty, kto nie ma internetu a jak juz sie dorwie do modemu u kogos to szerzy herezje sprzed stu lat na lewo i prawo wink.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 10.12.2017, 14:38:01
Post #13





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Wpisz sobie
  1. <?php
  2. class Test {
  3. private $att;
  4. private $def;
  5.  
  6. }


W Netbeans wciśnij alt+insert - getter & setter. Masz wygenerowane wszystkie metody tylko że nazewnictwo leży. Podkreślenie owszem, stosowało się mocno w ZF1, tyle że gdybyś tak teraz oznaczał wszystko w ten sposób miałbyś potężne problemy np z hydratorem (który swoją drogą stosowałem praktycznie od jego wymyślenia również w projektach ZF1 i wymagało przemyślenia od nowa zwłaszcza nazw encji - modeli).

Ten post edytował viking 10.12.2017, 14:38:47


--------------------
Go to the top of the page
+Quote Post
leonpro778
post 10.12.2017, 15:02:37
Post #14





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Cytat(nospor @ 10.12.2017, 14:21:05 ) *
Skolo klucz z twojej wypowiedzi: STOSOWALI - czas przeszly
Kiedys ludzie przez wieki zyli w jaskiniach....

Dobra, zadałem sobie trudu aby odnaleźć ich bieżącą dokumentację:
Cytat
For variables that are declared with private or protected visibility, the first character of the variable name MAY be a single underscore. This is the only acceptable application of an underscore in a variable name, and is discouraged (as it makes refactoring to public visibility more difficult). Member variables declared with public visibility SHOULD NOT start with an underscore.

smile.gif


Oooo, i w końcu dobry argument:
Cytat(viking @ 10.12.2017, 14:38:01 ) *
Wpisz sobie
  1. <?php
  2. class Test {
  3. private $att;
  4. private $def;
  5.  
  6. }


W Netbeans wciśnij alt+insert - getter & setter. Masz wygenerowane wszystkie metody tylko że nazewnictwo leży. Podkreślenie owszem, stosowało się mocno w ZF1, tyle że gdybyś tak teraz oznaczał wszystko w ten sposób miałbyś potężne problemy np z hydratorem (który swoją drogą stosowałem praktycznie od jego wymyślenia również w projektach ZF1 i wymagało przemyślenia od nowa zwłaszcza nazw encji - modeli).

Masz rację z generowaniem nazw. Ja jednak używam PHPStorm smile.gif Efekt podobny dlatego i tak nazwy sobie piszę praktycznie od podstaw. Odpiszę dokładnie wieczorem bo z t telefonu piszę i ciężko jak cholera.
Go to the top of the page
+Quote Post
nospor
post 10.12.2017, 15:06:45
Post #15





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Nie bardzo rozumiem, o czym ma swiadczyc ten wycinek z dokumetnacji. Przeciez wyraznie napisali ze sie z tego wycofuja. Trzymaja tylko jako relikt przeszlosci.

Dostales linki do PSR - z nimi sie zapoznaj bo to jest to co teraz obowiazuje


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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: 19.04.2024 - 06:11