Ben tuz tahıllarımı birkaç ay sonra ekleyebilirsiniz eğer:
Kamu özelliklere sahip çok un-OO olduğunu. Sadece (diğer nedenler arasındadır) nedeniyle bir doğrudan manipülasyonu kullanarak kolayca Refactor veya bazı dış kaynak alanını değiştirir (daha fazla) kontrol denetimleri gerçekleştirmek için yollar vermez herşey, kapsüllü edilmelidir. Örneğin, bir proje boyunca birkaç kez kullanılan birçok alanları ile bir sınıf var diyelim, ve bu proje dosyalarının binlerce içerir; Çalışıyorsa olmuştur ve şimdi birkaç yıl için genişletilmiş bir proje. Adlı şirketin iş modeli değiştirme, ya da bir sorun alanın veri türünün bazı ve şimdi bazı doğrulama olması gerekir ile bulundu olduğunu olduğunu varsayalım; doğrudan ortak üye erişen kaynak kodunun tüm bu binlerce olduğunu doğrulama yinelenen olacak? PHP, çözüm basit, ama çoğu OO programlama dili (ig Java). Olabilir Aslında OO based on encapsulation. Kısacası, kapsül temiz kod üretmek değil, aynı zamanda değil sadece olmasıdır kodu (maliyet-etkin ve uyumlu demek değil) oldukça yaşatılabilir.
Sette __ __ get / tarafından manipüle ediliyor Özel üye (dizi) sahip Öneriniz iyidir. Bu yolla, yol boyunca bazı ekstra doğrulama gerekiyorsa sadece setter ve / veya getter oluşturmak ve bunun sonu olacak. Bazıları kod tamamlama tekme-açamazsınız __ get / __ set olarak sayaç üretken olmak ile iddia edilebilir. IMHO, kod tamamlama güvenmek sadece tembel kodlama olduğunu. Ama sonra tekrar, her üye bu kendi alıcı ve / veya setter var olan daha kapsamlı bir API belgelerine yazmak için izin verir. Şahsen, ben genelde kullanmak technique, iç ya da çok genel amaçlı sınıflar için. Tüm alanlar herhangi bir doğrulama gerekmez, ya da dediğin gibi bunlardan birkaç düzine sonra kullanarak, varsa sihirli yöntemler bence kabul edilebilir olurdu.
Alt satırı sınıf örnekleri üzerinde doğrudan üyesi erişim, süre kaçınmaktır. Size ulaşmak için karar nasıl bu kesinlikle size kalmış. Sadece API de bunu yapmak daha soyut belgelenmiş olduğundan emin olun.
Son bir not olarak, PHP, zaten gibi bir şey, örneğin, onların alanlarını kapsülleme değildir kullanılmaktadır sınıfları varsa
class SomeObject {
public $foo;
public $bar;
public $baz;
//...
}
sadece böyle bir şey ile bir şey refactor kalmadan bu sınıf çözebilirsiniz:
class SomeObject {
private $_foo; // having underscore as prefix helps to know what's private/protected
private $_bar; // inside the code.
private $_baz;
public function __get($name) {
$methodName = 'get'.ucfirst($name);
if (method_exists($this, $methodName)) {
return $this->{$methodName}();
} else {
throw new Exception("Method '{$methodName}' does not exist");
}
}
public function __set($name, $value) {
$methodName = 'set'.ucfirst($name);
if (method_exists($this, $methodName)) {
$this->{$methodName}($value);
} else {
throw new Exception("Method '{$methodName}' does not exist");
}
}
public function getFoo() { return $this->_foo; }
public function setFoo($value) { $this->_foo = $value; }
public function getBar() { return $this->_bar; }
public function setBar($value) { $this->_bar = $value; }
public function getBaz() { return $this->_baz; }
public function setBaz($value) { $this->_baz = $value; }
}
Sonra
$obj = new SomeObject();
$obj->foo = 'Hello world'; // legacy code support
$obj->setFoo('Hello world'); // same thing, but preferred
Ve OO paradigma sahip olan ve direct access bir örneğinin niteliklerine de tatmin. Ayrıca __call()
öneki 'get' veya 'set' ve çağrı __get()
ve __set()
buna göre kontrol olabilir, ama ben bu olsa, bu kadar ileri gitmezdim gerçekten ->member
ve ->getMember()
/ ->setMember()
aracılığıyla özel üye bulunuyor erişmek için genel amaçlı sınıfları sağlayacak