Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dostęp do prywatnych pól z innej klasy.
Forum PHP.pl > Forum > PHP > Object-oriented programming
klinski
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ą.
batman
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ę.
mike
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.
klinski
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ź.
wookieb
http://www.php.net/manual/pl/language.oop5.visibility.php
Poczytaj o "protected"
dr_bonzo
Nie protected!

Przeciez masz metody! Uzyj ich jako metody dostepowe do tych zmiennych prywatnych.
phpion
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. ?>
LBO
@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. ?>
klinski
  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.
LBO
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ć.
dr_bonzo
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.
klinski
Nie mam konkretnego przypadku, tak tylko zastanawiałem się czy jest taka możliwość w php. Dzięki wszystkim.
Morkai
Jest, ale w PHP5.3:
http://wortal.php.pl/wortal/artykuly/php/p..._w_php6_czesc_1
szukaj: ReflectionProperty::setAccessible
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.