Biz burada değil, PHP ile ilgili kesinlikle C # hakkında konuşuyor, Java, vb (derleyici bunları optimize nerede), ben alıcılar ve belirleyiciler sadece vekil için özel bir alanın değerini ihtiyaç kaynakların israfı olarak görüyorum ve başka bir şey yapmak.
Benim Kurulum, ben, iki berbat sınıfları ve beş kamu alanları ile başka bir (neredeyse exactly java tuhaftır kodu gibi görünüyordu) alanını vekalet beş alıcı / ayarlayıcı çiftleri tarafından saklanmış beş özel alanlar ile bir yapılan ve bir örneğini oluşturduktan sonra sonunda sözde memory_get_usage (). Alıcı / ayarlayıcıları ile komut 59708 bellek bayt ve kamu alanları ile komut dosyası 49244 bayt kullanmıştır.
Böyle bir web sitesi çerçeve olarak herhangi bir önemli boyutu, bir sınıf kitaplığı bağlamında, bu yararsız alıcılar ve belirleyiciler bellek için çok büyük bir kara deliğe kadar ekleyebilirsiniz. Ben refactored zaman (i seçim olsaydı onların tercihidir, benim değil. Ben bunun için kullanmak olmaz değil ama PHP bize herhangi aşılmaz kısıtlamalar empoze değil, söyledikten) PHP benim işveren için bir çerçeve gelişmekte olan ve yerine alıcılar / belirleyiciler kamu alanlarını kullanmak için sınıf kitaplığı, bütün yerin en az istek başına% 25 daha az bellek kullanarak sona erdi.
__ (), __ Set olsun () ve __ call () 'sihirli' yöntemleri gerçekten arayüz değişiklikleri ele için parlayacak. Eğer bir alıcı / ayarlayıcı (veya bir alana bir alıcı / ayarlayıcı) bir alan göç gerektiğinde herhangi bir bağımlı kod süreci şeffaf yapabilirsiniz. Bir yorumlanmış bir dil ile, hatta Eclipse PDT veya NetBeans tarafından sağlanan kod duyarlılık için oldukça iyi desteği ile bir alan veya yöntemin tüm kullanımlarını bulmak biraz zor, yani sihirli yöntemler sağlanması için yararlı olduğu yeni, eski arabirimi hala delegeler işlevsellik.
Yerine alıcılar / belirleyiciler alanları kullanarak geliştirilen bir nesne var ve 'tarla' uygunsuz ya da artık doğru kullanımını tarif, ya da çünkü biz, 'fieldWithBetterName' için 'tarla' olarak adlandırılan bir alanını yeniden adlandırmak istiyorsanız söyleyin sadece düz yanlış. Ve biz bir alıcı kullanarak başlangıçta bilinmemektedir çünkü tembel yük veritabanından değeri 'field2' adlı bir alanını değiştirmek istedim ki ...
class Test extends Object {
public $field;
public $field2;
}
olur
class Test extends Object {
public $fieldWithBetterName = "LA DI DA";
private $_field2;
public function getField2() {
if ($this->_field2 == null) {
$this->_field2 = CrapDbLayer::getSomething($this->fieldWithBetterName);
}
return $this->_field2;
}
public function __get($name) {
if ($name == 'field')) {
Logger::log("use of deprecated property... blah blah blah\n".DebugUtils::printBacktrace());
return $this->fieldWithBetterName;
}
elseif ($name == 'field2') {
Logger::log("use of deprecated property... blah blah blah\n".DebugUtils::printBacktrace());
return $this->getField2();
}
else return parent::__get($name);
}
}
$t = new Test;
echo $t->field;
echo $t->field2;
(Bir yan not olarak, bu biraz ben __ get () ve __ set var hemen hemen her şeyi (bildirilmemiş fields erişilen bir istisna atar) beyanı için kullanılacak sadece bir temel sınıf 'Object uzanır')
Sen __ () çağrısı ile geriye gidebilirsiniz. Bu örnek oldukça kırılgan, ama temizlemek zor değil:
class Test extends Object {
public $field2;
public function __call($name, $args) {
if (strpos($name, 'get')===0) {
$field = lcfirst($name); // cheating, i know. php 5.3 or greater. not hard to do without it though.
return $this->$field;
}
parent::__call($name, $args);
}
}
Alıcı ve PHP setter yöntemleri ayarlayıcı bir şey yapmak için varsa iyi, ya da alıcı tembel yük bir şey, ya da bir şey oluşturulur, ya da her ne olmuştur sağlamak için vardır, ama onlar gereksiz ve savurgan eğer onlar vekaleten başka bir şey yapmazsak Özellikle arayüz değişiklikleri yönetmek için yukarıda olanlar gibi birkaç teknikleri ile alan,.