OO PHP doğrudan üye acccess

7 Cevap php

Ben her zaman doğrudan bir üye değişkeni olsun / set asla düşündüm. Örneğin

$x = new TestClass();
$x->varA = "test":
echo $->varB;

Sana always üye değişkenleri erişmek için nesne yöntemleri kullanın gerektiğini düşündüm.

Ama ben sadece __ set bakarak ve __, olsun doğrudan erişim üyelerine ok ima hangi oldum.

Herhangi bir düşünce?

7 Cevap

Burada doğru cevabı vardır.

Eğer keyfi programlama mantığı bazı set üzerine bu erişim koşullu yapmak için yeteneğini kaybeder çünkü Başlangıçta, üye değişkenleri doğrudan erişim kötü bir fikir olarak kabul edildi. Biz alıcı ve ayarlayıcı yöntemleri terörü var bu yüzden.

__set ve __get gibi sihirli yöntemler olması bu endişeyi ortadan kaldırır. Size nesne erişim üye değişkenler kullanıcıları istediğiniz tüm ve size bu erişim etrafında bazı programatic mantığa ihtiyacı keşfetmek eğer o zaman, sihirli yöntemleri kullanabilirsiniz olabilir.

However, özellikle PHP, __set ve __get bir performans açısından arınmış değildir. Ayrıca, unutmayın __set ve ulaşılmaz (özel, vb korumalı) üye değişken erişildiğinde __get sadece çağrılır. Bu sınıf daha az net yapan sınıf tanımı, gelen üye değişkeni kaldırarak dışında, bir sınıf içinde __set ve __get çağırmak için bir yolu var demektir.

Birçok şey PHP gibi, bu işlemek için net bir "iyi" bir yolu var.

Bir sınıf erişildiğinde zaman kod yürütmek için gerekli değil hangi için üye değişkenleri varsa sadece PHP değil, genel nesne yönelimli programlama, orada belirleyiciler ve alıcılar yapmak gerek, ve değişkenler doğrudan ulaşılabilir.

Bu kamu eğer özelliklerini bir nesnenin (değişkenler) Erişme Tamam.

Korunmaları halinde özel / (which is something new in PHP 5, that didn't exist in PHP 4), bunları doğrudan erişemez.

Bunu yapmak veya erişimcilerine geçiyor sen / yapmak istediğiniz ne gerek bağlıdır:

  • Sadece verilere erişmek istiyorsanız, erişimcilere gerekmez
  • veri erişildiğinde bazı eylemleri gerçekleştirmek istiyorsanız (örneğin, bir değerin doğruluğu kontrol), erişimcilere kullanmalısınız - yöntemi __get / __set veya maginc da bahis değil.
  • Bu iki sihirli yöntemler kullanılarak kullanıcı için saydam olması avantajına sahiptir; istediğiniz zaman ve kendi kodu yeniden yazmak için kullanıcılar zorlamadan, onları ekleyebilirsiniz.
  • Ama alıcılar / ayarlayıcıları kullanarak (siz performansı hakkında konuşmak zaman zaman bir yöntem aramak zorunda gibi, bazı CPU maliyeti) bir maliyeti olduğu söyleniyor unutmayın

Sonunda, "doğru yol" değil, "en iyi yol" var: orada iki yolu vardır, ve bir ihtiyaçlarınız için en uygun hangi seçim size kalmış.

Kendi projeleri için, burada ben genellikle ne var:

  • Hiçbir şey kontrol etmek gerekmez, ben alıcılar / ayarlayıcıları kullanmayın
  • when I need some special behaviour, I declare my variables as protected/private, and create a special getter/setter (like getName/setName)
    • Bu btw, her yöntem için bir PHPDoc sahip ve ben kullanmak IDE ipucunu avantajı vardır

Önce PHP 5 için, bunu yapabilirdi. PHP 5 tanıtımı ile, özel değişkenleri bildirebilirsiniz. Bu yüzden özel değişkenler için hiçbir kural yoktur, çünkü değişkenleri doğrudan erişmek PHP 4 kodları görmek için olağandışı değil.

Ben doğrudan sınıf değişkenleri erişmek için ok düşünüyorum. Bu değişkenleri değiştirmeden diğer sınıfları tutmak istiyorsanız bunları özel yapabilirsiniz. Eğer kesinlikle kopya bir kamu alıcı ve ayarlayıcı varsa sınıfı alanına geçti değer ben sadece overcomplicated yaklaşım olduğunu düşünüyorum.

Eğer bir şekilde değer işlemek zorunda sana alıcı ya da ayarlayıcı kullanmak isteyeyim nerede aklınıza gelebilecek tek durumdur.

Purist OO perspektiften yapılacak doğru şey ilgili veri mevcut yapar kendi ayarlayıcı / alıcı yöntemi (ideal PHP'nin yüklenme ile) oluşturmaktır. (Büyük olasılıkla ideal olan, PHP etkili __ get ve __ set ile bu jenerik sürümleri ile sunmak olduğunu, ancak bu sen / bir şey set olsun izin verir.)

Ayrıca dolayısıyla yöntemleri olsun / kümesi kullanmak için zorlama doğru görünürlük (özel, korumalı, vb) için bir sınıf içindeki değişkenler (ve aslında yöntemleri) ayarlamanız gerekir.

Look at the manual:
http://us2.php.net/manual/en/language.oop5.magic.php

Magic Methods
The function names __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state and __clone are magical in PHP classes. You cannot have functions with these names in any of your classes unless you want the magic functionality associated with them. 

Caution
PHP reserves all function names starting with __ as magical. It is recommended that you do not use function names with __ in PHP unless you want some documented magic functionality. 

Sadece (ben .. sen değişkenleri doğrudan erişim karşı alıcı ve ayarlayıcıları beyan öneririz) ve ben keyfi methods.They çağırmak için __ çağrı MAGIC yöntemler de var olmasıdır yanlış olmazsam __ get ve __ .. set onlar değil mi unutmak iyi OOP yapmak 't Olağan faaliyetler içindir.

Sen kullanarak olmamalıdır __ almak ve çok özel kod yazarken sürece __ arama ayarlamak veya __ (php kütüphanede Javabridge gibi diğer nesnelere aramaları vekalet için es bazı çerçeve, falan http://php-java-bridge.sourceforge.net/).