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%)
-----


  1. <?php
  2. class Type {
  3. private $mType;
  4.  
  5. public function set( $mType ) {
  6. $this->mType = $mType;
  7. }
  8.  
  9. public function get() {
  10. return $this->mType;
  11. }
  12.  
  13. public function __toString() {
  14. return $this->get();
  15. }
  16. }
  17.  
  18. class String extends Type {
  19. public function length() {
  20. return strlen( $this->get() );
  21. }
  22. }
  23.  
  24. class Input extends String {
  25.  
  26. public function toForm( $sName ) {
  27. $sForm = '<input type=\"text\" name=\"' . $sName . '\"';
  28.  
  29. if( $this->get() != '' ) {
  30. $sForm .= ' value=\"' . $this->get() . '\"';
  31. }
  32.  
  33. return $sForm . '/>';
  34. }
  35.  
  36. }
  37.  
  38. abstract class Bean {
  39. protected $aAttributes = array();
  40.  
  41. public function __get( $sName ) {
  42. return array_key_exists( $sName, $this->aAttributes ) ? $this->aAttributes[ $sName ] : null;
  43. }
  44.  
  45. public function toForm() {
  46. $aForms = array();
  47.  
  48. foreach( $this->aAttributes as $key=>$value ) {
  49. $aForms[ $key ] = $this->$key->toForm( $key );
  50. }
  51.  
  52. return $aForms;
  53. }
  54. }
  55.  
  56. class CommentBean extends Bean {
  57.  
  58. public function __construct() {
  59. $this->aAttributes[ 'title' ] = new Input();
  60. $this->aAttributes[ 'body' ] = new Input();
  61. }
  62. }
  63.  
  64.  
  65.  
  66. $cb = new CommentBean();
  67. $cb->title->set('tytul1');
  68. $cb->body->set('tresc1');
  69. $aForms = $cb->toForm();
  70. echo $aForms['title'];
  71.  
  72. $dlugosc = new Input();
  73. $dlugosc->set( $cb->title->length() );
  74. echo '<br/><br/>';
  75. echo $dlugosc->toForm( 'dlugosc' );
  76.  
  77. echo '<hr/><hr/>';
  78.  
  79. //normalne wykonanie metody __toString()
  80. echo $cb->title;
  81.  
  82. echo '<hr/>';
  83.  
  84. //przecinek zamiast kropki
  85. echo $cb->title,'<hr/>';
  86.  
  87. //kropka zamiast przecinka
  88. echo $cb->title.'<hr/>';
  89. ?>

Ciekawi mnie kwestia kropki i przecinka. Gdy jest kropka php nie wykonuje metody __toString(), a gdy przecinek wykonuje. Gdy zastosujemy przecinek to czy
  1. <?php
  2. echo $cb->title, '<hr/>';
  3. ?>
jest równoznaczne z:
  1. <?php
  2. echo $cb->title;
  3. echo '<hr/>';
  4. ?>
(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) na to wygląda.


Najlpeszmy i "najczystszym" rozwiązaniem było by chyba wprowadzenie czwartego typu access ;-), który by miał większość właściwości private jednak pozwalał by na zwrócenie obiektu. ;-)

Ten post edytował dag 3.07.2005, 12:50:41
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: 2.10.2025 - 19:11