Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> odwoływanie się do priv pola, które jest obiektem
dag
post
Post #1





Grupa: Zarejestrowani
Postów: 180
Pomógł: 0
Dołączył: 24.12.2003

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


Najpierw podam kod:

Klasa String:
  1. <?php
  2. class String {
  3. private $sTxt;
  4.  
  5. public function set( $sTxt ) {
  6. $this->sTxt= $sTxt;
  7. }
  8.  
  9. public function get() {
  10. return $this->sTxt;
  11. }
  12.  
  13.  
  14. public function length() {
  15. return strlen( $this->sTxt );
  16. }
  17.  
  18. public function __toString() {
  19. return $this->get();
  20. }
  21. }
  22.  
  23. ?>


Klasa Coment:
  1. <?php
  2. class Comment {
  3. private $title;
  4.  
  5. public function __construct() {
  6. $this->title = new String();
  7. }
  8.  
  9. public function __call( $sName, $aArguments ) {
  10. return $this->$sName;
  11. }
  12.  
  13. }
  14. ?>


Odwołanie:
  1. <?php
  2. $c1 = new Comment();
  3. $c1->title()->set('jakis tytul');
  4. echo'Dlugosc tekstu to ' . $c1->title()->length() . ' znakow';
  5.  
  6. ?>


Zastosowałem tutaj IMHO brzydkie rozwiązanie z użyciem metody __call.

Innym rozwiązaniem jest zastosowanie public $title. Wówczas odwoływalibyśmy się w ten sposób:
  1. <?php
  2. $c1 = new Comment();
  3. $c1->title->set('jakis tytul');
  4. echo'Dlugosc tekstu to ' . $c1->title->length() . ' znakow';
  5.  
  6. ?>

Czyli bez użycia title(). Jednak chyba nie jest to zbyt dobry pomysł ponieważ zmienna będzie publicznie dostępna, a takto mamy tylko dostęp do jej metod (title->set, title->length, etc.), więc nie można jej np. usunąć z zewnątrz.



Żeby nie zakładać nowego tematu napiszę, że brakuje mi bardzo przeładowywania metod w taki oto sposób:
  1. <?php
  2. class Comment {
  3. public function __construct() {}
  4. public function __construct( $sTitle ) {}
  5. public function __construct( $sTitle, $sBody ) {}
  6. }
  7. ?>

Jestem ciekaw jak sobie radzicie z tym problemem.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dag
post
Post #2





Grupa: Zarejestrowani
Postów: 180
Pomógł: 0
Dołączył: 24.12.2003

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


Cytat(dasko @ 2005-07-02 20:14:49)
Cytat
Jednak jeśli użyję __get to i tak nie sprawdzi się to, ponieważ zmienna $title istnieje i nie dojdzie do wykonania metody __get.

Czyżby ? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Sprawdzałeś? Przeczytaj to -> http://www.php.net/manual/en/language.oop5...ading.php#53539
( notka by Dasko (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )

Czytałem czytałem i to wielokrotnie ;-)

Dla leniwych:
  1. <?php
  2. class MyClass {
  3.  
  4.  private $foo;
  5.  
  6.  public function __get($name) {
  7.  echo $name . ' doesn't exist...<br />';
  8.  }
  9.  
  10.  public function __set($name, $value) {
  11.  echo 'Cannot set ' . $name . '. The requested property doesn't exist...<br />';
  12.  }
  13.  
  14. }
  15.  
  16. // class' instance
  17. $obj = new MyClass;
  18. // trying to access foo - __get() is called
  19. echo $obj->foo;
  20. // trying to set foo - __set() is called
  21. $obj->foo = 'newValue';
  22. ?>



Cytat
The feature was tested on php 5.1-dev.


Ja mam php Version 5.0.3 i wyskakuje mi
Cytat
Cannot access private property MyClass::$foo
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: 5.10.2025 - 07:57