2009-11-22 14 views
6

Czy metoda obiektu może mieć dostęp do chronionej własności innego obiektu tej samej klasy?Metoda uzyskiwania dostępu do chronionej właściwości innego obiektu tej samej klasy

Kodowanie w PHP, i właśnie odkryłem, że chroniona właściwość obiektu może być dostępna przez metodę tej samej klasy, nawet jeśli nie jest tego samego obiektu.

W tym przykładzie na początku otrzymasz "3" na wyjściu - ponieważ funkcja readOtherUser pomyślnie osiągnie wartość -, a następnie wystąpi błąd krytyczny PHP - ponieważ program główny zakończy się niepowodzeniem dostęp do tej samej wartości.

<?php 

class user 
{ 
protected $property = 3; 

public function readOtherUser() 
{ 
    $otherUser = new user(); 
    print $otherUser->property; 
} 
} 

$user = new user(); 

$user->readOtherUser(); 
print $user->property; 

?>

Jest to błąd PHP czy jest to zamierzone zachowanie (i będę musiał uczyć się na nowo tę koncepcję ... :)) (i są tam odniesienia do rzeczywistości)? Jak to się robi w innych językach programowania?

Dzięki!

+1

NB. Ruby's ['private'] (http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html#s4) zachowuje się jak opisano - prywatnej metody nie można wywołać w innej instancji. – outis

Odpowiedz

6

Jest to przeznaczone. Możliwe jest nawet uzyskanie dostępu do prywatnych członków tej samej klasy. Więc pomyśl o modyfikatorach, aby były modyfikatorami klasy, a nie obiektowymi modyfikatorami.

PHP nie jest jedynym językiem, który ma tę funkcję. Java na przykład ma to również.

2

Jest to zamierzone zachowanie. Zabezpieczona zmienna lub funkcja oznacza, że ​​dostęp do niej może mieć ta sama klasa lub jakakolwiek klasa dziedzicząca z tej klasy. Zabezpieczoną metodę można wywołać tylko z poziomu klasy, np. nie można tego tak nazwać:

$object = new MyClass(); 
$object->myProtectedFunction(); 

To spowoduje błąd. Jednak z poziomu zdefiniowanej klasy "MyClass" można doskonale wywołać funkcję chronioną.

To samo dotyczy zmiennych. Podsumowano:

use PROTECTED on variables and functions when: 
1. outside-code SHOULD NOT access this property or function. 
2. extending classes SHOULD inherit this property or function. 
Powiązane problemy