PHP sınıfı def: Bireysel erişiciler / mutators veya __ anahtarıyla set () ()?

2 Cevap php

/ En iyi uygulama tercih edilir bir PHP sınıfı, tanımlarken? Ben bakan değilim herhangi önemli farklılıklar vardır?

Bir __set() sihirli yöntem yazmak ve bir switch() Ben istediğiniz tüm özel üyeleri için olgu ile içinde inşa koymak için daha temiz, özlü ve kolay olabilir gibi görünüyor erişim sağlar. Bu sınıf içinde gelen automagically denilen olmaz, ama ben içten erişimci / mutator kullanmak istiyorsanız tekrar setFoo(), bu yüzden, ben açıkça bir yöntemini ya bir yol aramak olurdu olurdu ne.

Diğer fark, sınıf dışında kod, hep üyesi $obj->foo gibi aynı şekilde vars kamu (doğrudan) veya özel (kullanarak __set()), karşı olmadığını erişebilir olduğunu Birçok ayrı yöntemleri kullanarak.

Ben bu çoğunlukla estetik bir seçim aşağı gelir sanırım. Ben bir satın alma üzerinde adres veri varsa Örneğin, ben sadece nakliye ve fatura bilgileri vb ad, soyadı, Adres1, Address2, şehir, eyalet, her biri için 16 veya daha fazla ayrı erişim yöntemlerinin olmasını istemiyorum.

Ben ardı ettik herhangi önemli farklılıklar vardır? (Bu özel olarak işaretlenmiş çünkü sofistike bir IDE sınıf dışında otomatik tamamlama bir üye adı reddedebilir miyiz?) Ben hemen hemen benim kendi özgün soruyu yanıtladı mı? Lütfen giriş için şimdiden teşekkür ederiz.

2 Cevap

Eğer dışarıdan erişilebilir olmasını istediğiniz her üye için ayrı erişimcilerle gidin. Ben de denedim ve bu nedenlerle erişimciler kullanmak için bulduk:

  • Eğer API (doxygen / PHPDoc / Zend) belgelemek için kullanmak ne olursa olsun, üretilen dokümanlar sihirli fonksiyonlar aracılığıyla erişilebilir üyeleri göstermez.
  • Sen erişimcileri belge olabilir. Gerçekten belgelerinde böyle bir çizgi koymak mümkün olmalı: "Eğer IMPORTANT! Bu fonksiyonu) (o otherFunction kullanmak, gerçekten yavaş olacak, veritabanına bağlanır."
  • AKSESUARLAR uygulanması herkes için kolayca görülebilir. Ben erişimci değerini alma / ayarlama dışında bir şey yok olmadığını kontrol etmek için bir 200-çizgi sihirli işlevin ayrıntıları kazmak istemem (biz sonuçta erişimcilerini yazıyoruz bu yüzden.)
  • Zaten IDE otomatik tamamlama sözü.
  • __ Get () fonksiyonu iyi tanımlanmış bir fonksiyonu başlığa sahiptir, bu yüzden dizilerle çalışırken, yani $numbers = &$object->getNumbers(); $numbers[] = 4; gerçekten büyük olan (örneğin, bir başvuru döndürmek alıcılar oluşturmak mümkün olmayacaktır - olmadan referans, tekrar ayarlayıcı aramak gerekir.)

Gördüğüm en büyük farkı phpdoc ile:

  • __set, her erişimcisine PHPDoc oluşturmak mümkün olmayacaktır kullanarak
  • modernler IDE tarafından kullanılan phpdoc, bu da sihirli yöntemler (Using @property ), bu noktada olsa da, yardımcı olabilir kullanmak eğer tip-Dayatma ne de kod tamamlama almak anlamına gelir.

Personnaly, ben biraz daha kod yazma anlamına gelse bile, erişiciler kendimi tanımlama ile devam ediyorum:

  • phpdoc ile hiçbir sorun
  • ne olursa olsun parametreleri kullanmak ve istediğiniz türlerini dönebilirsiniz
  • açıkça yöntemler kullanılabilir hangi gösterir
  • kolay olması gerçekten uzun bir __set yöntemi olmadan, her proerty için özel kodu kullanmak.

Sınıf içinde gelen özelliklerini ayarlarken Ayrıca, ben bu accessor yöntemleri kullanmak: evet, biraz daha kod anlamına gelir - ama aynı zamanda içerdikleri (bazı şeyler kontrol etmek için kod gibi) belirli bir kod geçiyor demektir.

Sadece veri depolamak için, ve herhangi bir spesifik davranış tanımlamak gerekmez bazı özelliklerini kullanarak Son olarak eğer, neden halk olarak onları teşhir ve kullanıcıların doğrudan bu erişmesine izin yok?