Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Dostęp do prywatnych pól z innej klasy.
klinski
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 22.03.2007

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


Witam,

Chciałbym się dowiedzieć czy jest możliwe w php coś takiego. Mam dwie klasy.

  1. <?php
  2. class pierwsza{
  3.  
  4.    private $p_1;
  5.        private $p_2;
  6.  
  7. }
  8.    
  9. class druga {
  10.  
  11.        private $pierwsza;
  12.    
  13.        $this -> pierwsza = new pierwsza;
  14.    //mozliwosc zapisu pol prywatny klasy "pierwsza"
  15.    
  16. }
  17. ?>


W klasie pierwsza mam pola prywatne. Czy jest możliwe aby z klasy drugiej i tylko z tej klasy była możliwość zapisu pól prywatnych klasy pierwsza?
Dziedziczenie raczej nie może być bo te klasy nie maja takiej relacji ze sobą.

Ten post edytował klinski 16.09.2008, 08:07:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
batman
post
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat
Lecz choćby przyszło tysiąc atletów
I każdy zjadłby tysiąc kotletów,
I każdy nie wiem jak się natężał,
To nie udźwigną - taki to ciężar!

Innymi słowy - nie da się.
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(klinski @ 16.09.2008, 09:05:55 ) *
Dziedziczenie raczej nie może być bo te klasy nie maja takiej relacji ze sobą.
A co by to dało? Przeciesz mówisz o polach prywatnych.
Jedyne co możesz zrobić to obejcie za pomoca metody magicznej _set(), ale to ... głupota. Po to robi się pola prywatne żeby były prywatne.
Go to the top of the page
+Quote Post
klinski
post
Post #4





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 22.03.2007

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


No tak z dziedziczeniem dałem ciała. Wiem, że po są prywatne aby nikt z zewnątrz nie mógł się do nich dostać, ale myślałem że może jest jakiś mechanizm w php, który określa ze inna klasa może modyfikować pola prywatne. No cóż trudno, nie ma to nie ma. Dzięki za odpowiedź.
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




http://www.php.net/manual/pl/language.oop5.visibility.php
Poczytaj o "protected"
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Nie protected!

Przeciez masz metody! Uzyj ich jako metody dostepowe do tych zmiennych prywatnych.
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Dokładnie tak jak pisze ~dr_bonzo. Napisz sobie własne tzw. settery i gettery, przykładowo:
  1. <?php
  2. class Demo {
  3.    private $version;
  4.    
  5.    public function getVersion() {
  6.        return $this->version;
  7.    }
  8.    
  9.    public function setVersion($v) {
  10.        $this->version = $v;
  11.    }
  12. }
  13. ?>

Aczkolwiek to nie rozwiązuje Twojego problemu z pierwszego postu. Możesz przekazywać źródło wywołania metody i na tej podstawie (zwykły warunek) określić czy dany obiekt (z którego nadeszło żądanie) ma prawo do wykonania danej operacji.
  1. <?php
  2. public function setVersion($v, $source) {
  3.        // jesli zadanie pochodzi z poprawnego zrodla...
  4.        if ($source instanceof Source_Allowed) {
  5.            $this->version = $v;
  6.        }
  7.        // ...a jesli nie
  8.        else {
  9.            // rzuc wyjatek lub nic nie rob
  10.        }
  11.    }
  12. ?>


Ten post edytował phpion 16.09.2008, 10:00:54
Go to the top of the page
+Quote Post
LBO
post
Post #8





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


@phpion, ja bym nie uzależniał tej klasy od źródła z którego przychodzi, tylko od Tego co składuje:
  1. <?php
  2. class Demo {
  3.  priotected $version;
  4.  
  5.  public function getVersion() {
  6.       return $this->version;
  7.   }
  8.  
  9.   public function setVersion(Version $v) { // na poziomie języka ustalasz co dokładnie ma byc w zmiennej.
  10.       $this->version = $v;
  11.   }
  12. }
  13. ?>
Go to the top of the page
+Quote Post
klinski
post
Post #9





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 22.03.2007

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


  1. <?php
  2. public function setVersion(Version $v)
  3. ?>


Nie wiem czy dobrze rozumiem Version $v jest obiektem klasy Version?
I nie wiem czy to rozwiąże mój problem z pierwszego postu.
Go to the top of the page
+Quote Post
LBO
post
Post #10





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Przepraszam, nie doczytałem - cały dzień tak dzisiaj mam :/ Nie, nie rozwiąże to Twojego problemu.

Mógłbyś napisać Twój konkretny przypadek użycia? Bo może dałoby się to w inny sposób rozwiązać.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Cytat
Czy jest możliwe aby z klasy drugiej i tylko z tej klasy była możliwość zapisu pól prywatnych klasy pierwsza?


W PHP nie ma "friend" czy jak to bylo z C++.

W Javie masz okreslnik zasiegu "package" (tzn piszesz definicje bez niego) przez co wszystkie klasy z danego pakiegu (namespace) maja dostep do tych zmiennych.
Go to the top of the page
+Quote Post
klinski
post
Post #12





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 22.03.2007

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


Nie mam konkretnego przypadku, tak tylko zastanawiałem się czy jest taka możliwość w php. Dzięki wszystkim.
Go to the top of the page
+Quote Post
Morkai
post
Post #13





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 25.08.2005

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


Jest, ale w PHP5.3:
http://wortal.php.pl/wortal/artykuly/php/p..._w_php6_czesc_1
szukaj: ReflectionProperty::setAccessible
Go to the top of the page
+Quote Post

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: 23.08.2025 - 06:41