Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][OOP] Metoda __set nie działa?
djgarsi
post
Post #1





Grupa: Zarejestrowani
Postów: 459
Pomógł: 26
Dołączył: 1.06.2009

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


Witam serdecznie.
Rozpocząłem naukę PHP OOP i jak to zwykle bywa, napotkałem problem i nie wiem o co chodzi.
Otóż mam klasą:
  1. <?php
  2.  
  3. class Samochod {
  4. public $predkosc_maksymalna;
  5.  
  6. function __set($nazwa, $wartosc) {
  7. if (($nazwa == "predkosc_maksymalna") && ($wartosc > 0) && ($wartosc < 350)) {
  8. $this->predkosc_maksymalna = $wartosc;
  9. }
  10. else {
  11. echo "Za szybko, zwolnij!";
  12. }
  13. }
  14. }
  15.  
  16. $pojazd = new Samochod;
  17. $pojazd->$predkosc_maksymalna = 200;
  18.  
  19. echo $pojazd->predkosc_maksymalna;
  20. ?>


Przy każdej wartości (np. 200) wyrzuca, że "za szybko" a jak wiadomo przy 200 powinno działać normalnie.
Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


@CuteOne: Metody magiczne powinny być publiczne, bo oczekujemy publicznego/globalnego dostępu do nich. Niemniej metody zadeklarowane jako prywatne również działają, co jest karygodnym błędem twórców PHP (zdaje się że w wersji 5.3 PHP pojawiał się w tej sytuacji WARNING).

Jednak nie o to mi chodziło we wcześniejszej odpowiedzi. Łopatologicznie:
przykład, w którym nie korzystamy z metod __set() i __get()
  1. class A {
  2. public $a;
  3. public function __set($key, $value) {
  4. $this->$key = $value;
  5. }
  6. public function __get($key) {
  7. return $this->$key;
  8. }
  9. }
  10. $o = new A;
  11. $o->a = 10;
  12. echo $o->a;

Ponieważ właściwość $a klasy A jest właściwością publiczną, mamy do niej bezpośredni dostęp za pomocą operatora wyłuskania -> i magiczne metody __set() i __get() nie będą w tej sytuacji wywoływane.

przykład, w którym korzystamy z metod __set() i __get()
  1. class A {
  2. private $a;
  3. public function __set($key, $value) {
  4. $this->$key = $value;
  5. }
  6. public function __get($key) {
  7. return $this->$key;
  8. }
  9. }
  10. $o = new A;
  11. $o->a = 10;
  12. echo $o->a;

Ponieważ właściwość $a klasy A jest właściwością prywatną, nie mamy do niej bezpośredniego dostępu za pomocą operatora wyłuskania -> i tutaj potrzebujemy magicznych metod __set() i __get() - tutaj będą one wywoływane.

Niemniej wykorzystanie tych metod magiczny w ten sposób jest bez sensu, bo musielibyśmy dokładnie kontrolować wszystkie właściwości klasy. Rozwiązanie, które podał CuteOne ma zdecydowanie większy sens.

Ten post edytował mortus 1.05.2013, 09:03:39
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 05:04