Nasıl önlemek için PHP nesne param, $ olarak bu aşırı kullanımı?

3 Cevap php

Ben şimdi birkaç yıl için PHP5 çalışan oldum ve ben site geliştirme hızlandırmak için kullanabileceğiniz hafif bir MVC çerçeve geliştirdik. Vb harika, otomatik formbuilder, autoSQL modülü, Works

Ben geliştirdik bir kötü alışkanlık, Ancak, kolay bir nesne param $ olarak bu güvenmektedir. Ben gerçekten (tüm site değişkenler tanımlanır) baz sınıftan uzatmak zorunda ve geçti $ bu nesne her nesne örneğini doldurmak için bir ayarlayıcı yöntemi kullanarak olmadan veri saklanması için nasıl anlamaya henüz. Her şey çalışıyor, ancak her nesne tüm uygulama durumu hakkında bilmek zorunda olduğunu saçma. Ben her nesne yalnızca "dış" bağlamında bir asgari bilgi gerektiren bir görevi belirlenmiş oluyor gerçekleştirmek istiyorum.

Örneğin, ben bir müşterinin hesap ayrıntılarını üreten bir sınıf var diyelim:

// pseudo account

Class account extends siteBase {

protected $formObj;
public $custID = 1;
public $name;
public $email;
// etc...

 function __construct() {

  $this->formObj = new FormBuild($this); // easy $this passing

  $this->formObj->getFormData();

  $this->formObj->build();

}
}

// pseudo form builder class

Class FormBuild extends siteBase {

 protected $data;

 function __construct($caller) {

  $this->set($caller); 

 }

 function set($arr) { 

  foreach($arr as $key => $val) {

   $this->$key = $val;

  }

 }

 function getFormData() {

  $this->data = new FormQuery($this); // more easy $this passing

 }

 function build() {
  foreach($this->data as $key => $val) {
   echo $key . " " . $val . "<br>";
  }
 }
}

Class FormQuery extends siteBase {

function __construct($caller) {

  $this->set($caller); 

 }

 function query() { 

  $sql = "SELECT email, phone FROM account WHERE custID = '$this->custID'";

  // query & return return result, etc.

 }

}

Ne "profesyoneller" durumda bunu yapıyorsun? Ben arabirimine biraz temizlemek isterdim ...

3 Cevap

Bu sorunun birçok yaklaşım vardır. İşte birkaçı

  1. Küresel ya da sınıf sabitleri
  2. Harici config / statik veri (INI tarzı, xml, yaml, veritabanı, vb) bazı tür bir yapılandırma sınıfı tarafından okundu
  3. registry pattern
  4. depdency injection/inversion-of-control pattern

Onlar tüm inişler ve çıkışlar var - hayır yoktur "tek gerçek çözüm."

Istemci kodu perspektif almaya çalışın: türetilmiş bir sınıf üst sınıf olarak aynı arayüzü ancak farklı bir uygulama olmalıdır.

Bu tür türetilmiş sınıfları kullanılmayan ana sınıflarında yöntemler gibi bir dağınık arayüzü var asla ve refactor başlamak için iyi bir ipucu olurdu. Büyük olasılıkla fark başka güçlü bir ipucu yöntemleri aynı argümanları (iki siteBase::__construct() kaynaklanan, account::__construct() FormBuild::__construct($caller) karşılaştırarak) yapmayız olmasıdır.

Aklımda yapılandırmayla Refactor olurdu, ne siteBase bir veritabanı içerir ama bir türetilmesi sınıf farklı veritabanları farklı / bir dizi ihtiyacı varsa? Sizin ortak sınıfları çekmek için deneyin ve gerçekten imza paylaşmak olduğunu hangilerinin görmek, bir anda birlikte bir kaç çifti.

Hem yukarıdaki yanıtların doğru.

Ben yerleşik artık bir uygulama temel sınıfından gereken uygun nesnelere geçmek bir kayıt nesnesi / özellikleri konteyner. Bir güçlük biraz bu çevrede $ geçen karşılaştırıldığında, ancak daha iyi bir planlama yapar ve benim nesneleri her şeyi bilerek vs bilmeniz gerekenleri tanımlamak için beni zorlar.

Üstlenmeden tavsiye ayrıca sadece bana karşı bir kerede çeşitli işlerde kendi işini yapıyor birkaç sık kullanılan nesneleri aşağı sıyırma var.

Ama hala gitmek için bir yol, ben hemen hemen her yerde app gelen uygulama hakkında her şeyi bilmek için alıştım ...