Nasıl ayarlanır PHP'nin __ get () kullanın ve __ yok () benim sınıf tanımlanmış alanlar için?

3 Cevap php

Ben PHP specs on overloading iyi bir okuma yaşadım ve örnekler en basit (stdClass benzer) özel alanları tanımlayan izin amaçlanmıştır görünmektedir.

Ama ne benim sınıfında tanımlanan özel alanlar hakkında? Nasıl bu atanmış / alınması gerekir? Ben olası değerleri hakkında bir anahtar yapmak ve belli değerler üzerinde hareket olabilir:

class A
{
    private $name;
    private $age;

    public function __get( $var )
    {
        switch ( $var )
        {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age+10; // just to do something different ;)
                break;
            default:
                break;
        }
    }
}

Bu iyi yöntemdir, ya da başka bir genel kabul görmüş en iyi uygulama var mı? (Bir sınıf içinde döngü sınıf değişkenleri mümkün olmadığını bilmiyorum, ama her şeyi geri dönmek istemiyorum çünkü ne olursa olsun bu çoğu durumlarda uygun değildir.)

3 Cevap

Bu etkili onları kamu yapacak, ve genellikle bu size sadece ortak özelliklerini kullanarak (ama performans ceza ödemek ve daha fazla kod, risk hataları yazmak zorunda) üzerinde hiçbir şey kazanır.

Kullanan kamu özelliğini kullanır ve aniden bunun için alıcı / ayarlayıcı gerek varolan bir kod yalnızca (ile örnekte olduğu gibi age).

Eğer mülkiyet yazılı / okunduğu zaman bazı kod yürütmek için gerekiyorsa (örneğin, salt okunur veya tembel veritabanından alıp yapmak), sonra normal alıcılar / ayarlayıcıları kullanmalıdır (getAge() / {[(1) ]}).

I __get() ve __set() geniş faydalanmak VE benim özellikleri ilan var public. Ben bir sınıf örneğinin adını yazdığınızda benim IDE benim için genel özellikleri liste olabilir bu yüzden, her iki dünyanın en iyi istedi. Nasıl özelliklerini sınıf dışında kamu ve görünür olmasına rağmen, PHP önleme yöntemleri işe aldın?

unset() the properties I __get() istiyorum ve __set() kullanılacak için sınıfta __construct(). bu yöntemi bulmaktan

:-) hayal kırıklığı bir çift akşamları aldı

Ben bunları kullanarak birçok insan görüyorum, ama burada bence budur değil.

Özel değişkenleri almak için, muhtemelen dış tarafından erişilebilir edebiliyoruz tanımlanan değişkenlerin listesini vermek istiyorum. Ardından, istenen değişken o dizide olup olmadığını görmek için kontrol edin. Bu ise, bu kazanılmış / değiştirilmesine izin. Eğer değilse, hata veya boş dönmek ya.

Dürüst olmak gerekirse, bunun için uygulamalar gerçekten case-by-case vardır. Eğer tek bir dizideki tüm bilgileri saklı bir kullanıcı sınıfı olsaydı, $ user-> name $ user-> hesabının ['name'], ya da buna benzer bir şey çekti olabilir.

Ayrıca, bir case-by-case daha, bir parola hash gibi, onlara değerlerini vermeden önce bazı değişiklik yapabilirdi.