Neden Doğrudan accesing mülkiyet cepten PHP tavsiye edilmez?

4 Cevap php

Ben bir özellik $ isim ve gaz giderici (get_Name ()) ve ayarlayıcı (set_name ()) yöntemleri, bir sınıf "insan" varsa, o nesneleri başlatmasını ve özellik ie ayarladıktan sonra

$paddy = new person();

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

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

Yukarıdaki kodda $paddy->name; NEDEN BU TAVSİYE DEĞİLDİR

EDIT

Yukarıdaki kod herhangi accessifiers atamadan bir örnek koddur .. Onun sadece $ çeltik-> isim kavramını anlamak için

4 Cevap

Garip şey, bir setter var, ama mülkiyet public terk olmasıdır. (Oluyor hiçbir __get sihir var varsayarsak.)

Genellikle fazla bir özellik atanabilir ne üzerinde kontrol ve ne yapamam almak için alıcılar / ayarlayıcıları kullanmak istiyorum. Veya, mülkiyet erişilen veya değiştirildiğinde kod çalıştırmak isteyebilirsiniz. Her iki durumda da, aksi takdirde oldukça anlamsız, mülkiyet private veya protected yaparak alıcılar / belirleyiciler kullanılmasını zorlamak gerekir. Kendinizi ya da kendi ayak çekmenizi sınıfı kullanır başkalarına önleyerek ilgili.

Sizin örnekte pasör sadece başka bir şey yapmadan değerini ayarlar, bu gereksiz bulunuyor. Bu değer ayarlanır zaman gereklidir başka bir şey yapar eğer pasör kullanmadan değerini değiştirmek mümkün olduğundan, sizin sınıf tasarımında bir kusur var.


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

Eğer yapmak isterseniz $bar protected, bu mümkün olmazdı.

Kamu alanları açığa kötü habit.From bir good artical PHP OO prensibi hakkında olurdu

If anything changes with the object, any code that uses it needs to change as well. For instance, if the person's given, family, and other names were to be encapsulated in a PersonName object, you would need to modify all your code to accommodate the change.

Ben kodu bu tür her zaman kullanmak gibi Açıkçası ben de 'kötü' şeyler yapıyorum.

Ama ne $ this-> ad (ya da bu-> nameFormatted $ yapacağını gibi) gibi inşa edilir:

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

veya bu satırlar boyunca bir şey.

Sen kamu bağlamında $ this-> adını kullanıyorsanız, ama yine sınıfta inşa ediyor ve korunan eğer yazılmaz.

Yoksa noktayı eksik ve 'kötü' bir şey aslında set-ting addır kamu kapsamında?