2010-04-22 13 views
6

Jeśli mam klasa "osobę" z nazwą nieruchomość dolarów i jego getter (get_name()) i setter metody (set_name()), a następnie po uruchamianiu obiektów i ustawienie właściwości tjDlaczego funkcja bezpośredniego dostępu nie jest zalecana w PHP OOP?

$paddy = new person(); 

$paddy->set_name("Padyster Dave"); 

echo "Paddy's full name: ".$paddy->name; //WHY THIS IS NOT RECOMMENDED... 

W powyższy kod $paddy->name; dlaczego nie jest to zalecane

EDIT

powyższy kod jest przykładowy kod bez przypisywania jakichkolwiek accessifi ers .. Wystarczy zrozumieć pojęcie $ paddy-> name

+0

Jedno słowo w tym kontekście: Ukrywanie informacji http://en.wikipedia.org/wiki/Dodanie informacji O to, o co prosisz, dotyczy ogólnie OOP, a nie tylko PHP. –

+0

Użyłem składni php i otagowałem pytanie do sekcji PHP, dlatego dodałem słowo kluczowe PHP, jestem świadom tego faktu, że jego ogólne dla wielu ..Thanksss –

Odpowiedz

6

Bo może kiedyś pozbyć się członka $name, zastępując go z (na przykład) $first_name, $last_name i fullname() metody (nie że to good idea). Oczywiście, z __get and __set, nie ma to większego znaczenia.

Mówiąc bardziej ogólnie, ustawienie właściwości może nie być tak proste, jak zapisanie wartości. Podanie bezpośredniego dostępu do pól elementów może spowodować inne funkcje powodujące niespójny stan obiektu. Wyobraź sobie, że przechowujesz tablicę, która musi pozostać posortowana; jeśli tablica jest publiczna, coś innego może przypisać nieposortowaną tablicę do pola.

8

Rzecz dziwna, że ​​masz setera, ale opuszczasz nieruchomość public. (Zakładając, że nie ma magii __get).

Zazwyczaj chcesz użyć modułów pobierających/ustawiających, aby uzyskać większą kontrolę nad tym, co można przypisać do właściwości, a co nie. Lub, możesz chcieć wykonać kod, gdy właściwość jest dostępna lub zmieniona. W obu przypadkach należy wymusić użycie modułów pobierających/ustawiających, tworząc właściwość private lub protected, w przeciwnym razie jest to zupełnie bezcelowe. Chodzi o zapobieganie tobie lub innym, które wykorzystają klasę do strzelania własną stopą.

Jeśli setter w twoim przykładzie ustawia tylko wartość bez robienia czegokolwiek innego, jest zbędny. Jeśli robi to coś innego, co jest wymagane, gdy wartość jest ustawiona, masz wadę w projekcie klasy, ponieważ można zmienić wartość bez użycia settera.


class Foo { 
    public $bar = 0; // is only allowed to contain numeric values 
    public function setBar($val) { 
     if (is_numeric($val)) { 
      $this->bar = $val; 
     } 
    } 
} 

$obj = new Foo(); 
$obj->bar = 'some value'; // set a string, which is not allowed 

Jeśli chcesz dokonać $barprotected, że nie byłoby to możliwe.

+0

"Jeśli robi to coś innego, co jest wymagane, gdy wartość jest set, masz wadę w swoim projekcie klasy, ponieważ można zmienić wartość bez użycia settera. " Czy U może to rozwinąć? plss –

+0

@Parth Zobacz zaktualizowaną odpowiedź. – deceze

+0

@Parth Jeśli zrobisz 'protected $ bar = 0;', '$ obj-> bar' jest niedozwolone i wygeneruje ostrzeżenie. Przeczytaj to: http://php.net/manual/en/language.oop5.visibility.php – deceze

3

odsłaniając obszary publiczne byłoby złym habit.From good artical o zasady OO w PHP

Jeśli coś zmienia się wraz z obiektem, jakiegokolwiek kodu, który wykorzystuje to musi również zmienić. Na przykład, jeśli dana osoba, rodzina i inne nazwiska miały zostać umieszczone w obiekcie PersonName, musiałbyś zmodyfikować cały swój kod, aby uwzględnić zmianę.

0

Oczywiście robię też "złe" rzeczy, ponieważ używam tego rodzaju kodu przez cały czas.

Ale co, jeśli $ this-> name (lub jak zrobiłbym $ this-> nameFormatted) jest skonstruowany jak:

protected var $name; 
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast; 

lub coś wzdłuż tych linii.

Używasz $ this-> nazwa w publicznym kontekście, ale nadal jest ona skonstruowana w klasie i jeśli jest chroniona, nie zostanie nadpisana.

A może brakuje mi punktu, a "zła" rzecz nazywa się w publicznym zakresie?

Powiązane problemy