Yayınlanan verilerden Object örneği oluşturma - PHP

6 Cevap php

Bir formdan geçirilen değerlerden bir nesne oluşturma ve doldurma en iyi yolu nedir?

Örneğin, ben bir kayıt eklemek veya güncellemek olacak ya özelliklerinde Renk, Model, Marka, Yıl ve bir yöntem Save, bir sınıf Car varsa.

Daha sonra tüm bu değerleri alanları vardır ve gönderilen bir form var. Ben yayınlanmıştır değerleri ile sınıf Araç bir örneğini oluşturmak ve ardından Kaydet yöntemi çağırmak istiyorum. Tüm iyi ve iyi.

Ama nesneleri iç özelliklerine gönderilen değerler atayarak en iyi yoludur. Bu basitleştirilmiş bir senaryo olduğunu varsayarsak ve fiili durum çok daha fazla özelliklere sahip olacağını, bireysel Set yapmak uzun soluklu çağırır.

Sadece her biri için Set yöntemini çağırmak için iyi midir? Ya da daha sonra set yöntemleri çağıran bir yöntem (veya yapıcı) bir dizi geçmek? Ya da başka bir yol?

En iyi uygulamalar üzerinde herhangi bir tavsiye takdir

Cheers Stuart

6 Cevap

Tam olarak bu kullanım durumda tasarlanmıştır gibi, sihirli işlevi __set_state() uygulamak olacaktır. Bu yöntemin içine uygulanmasını koyarak birden çok yarar vardır:

  1. Bu çok iyi tanımlanmış, bu fonksiyon ne (Bu PHP dokümanlar tanımlanan, kendi kaynak kodu aksine) olduğu
  2. Sen fonksiyon içinde özel üyeleri erişebilir
  3. var_export() olacak olan dampingli nesneler otomatik olarak bu işlevi kullanarak yeniden.

EDIT yorumların istenilen gibi:

class A {
    private $member = 1000;
    public static function test(A $a) {
        echo $a->member;
    }
}
echo A::test(new A()); // outputs 1000

EDIT yorumlarından başka bir isteği yerine getirilmesi:

Eğer php 5.3 kullanarak, istenen bir özellik (late static binding) tanıtıldı edildiği sürece statik bir yöntem çağrıldı hangi sınıfı bilemeyiz. Siz) get_called_class() by analyzing the current stack (using debug_backtrace() taklit neler yapabileceğini. Eğer bir çalışma get_called_class() fonksiyonu varsa , aşağıdakileri yapabilirsiniz:

class BaseClass {
    public static function __set_state($state) {
        $class = get_called_class();
        // Assumption: Constructor can be invoked without parameters!
        $object = new $class();
        foreach (get_class_vars($class) as $member) {
            if (!isset($state[$member])) {
                // Member was not provided, you can choose to ignore this case
                throw new Exception("$class::$member was not provided");
            } else {
                // Set member directly
                // Assumption: members are all public or protected
                $object->$member = $state[$member];
                // Or use the setter-approach given by Chaos.
                $setter = 'set' . ucfirst($member);
                $object->setter($state[$member]);
            }
        }
        return $object;
    }
}

Sen Reflection biraz büyü kullanabilirsiniz:

public function loadFromArray($array) {
    $class = new ReflectionClass(get_class($this));
    $props = $class->getProperties();
    foreach($props as $p) {
         if (isset($array[$p->getName()])
              $p->setValue($this, $array[$p->getName]);
    }
}

Sen bir taban sınıfta bu yöntemi uygulamak ve tüm yout nesne o devralan yapmak, böylece herhangi bir sınıfta kendini tekrar olmadan her nesnenin bu özelliğe sahip olabilir.

Özellikleri kamu iseniz:

foreach($_POST as $key => $value)
    $obj->$key = $value;

Bu belirleyiciler gerektiriyorsa:

foreach($_POST as $key => $value) {
    $set = 'Set' . $key;
    $obj->$set($value);
}

Peki, tek adımda bir nesneye sonrası dizi dönüştürebilirsiniz ...

$mypostobject = (object) $_POST;
echo $mypostobject->Colour;

EDIT: PHP dokümanlar link ekledi. http://uk.php.net/manual/en/language.types.object.php

Eğer nesne, kendi sınıfı ile bunu yapmak istiyorsanız, o zaman sonrası dizi ve sınıf kurmak sürer kurucu veya fonksiyon çeşit sırayla olacaktır.

class MyCar {
  public function __construct($postdata) 
  {
    $this->Colour = $postdata['Colour'];
    // etc
  }
};

$car = new MyCar($_POST);

tüm özelliklerini alacak bir kurucu oluşturmak

class Car {
  // private members …
  public function __construct($color, $type, $model, $make) {
    // assign your values here
  }
  // other methods
};

ilişkilendirilebilir dizilerle ilgili ise, siz de argüman olarak bir dizi ile bir kurucu kullanabilirsiniz:

public function __construct($car_properties) {}

ile ve daha sonra döngü sizin özellikleri

foreach($car_properties as $property => $value) {
  if(isset($value)) $this->property = $value
}

Önceden giriş doğrulamak / sterilize etmek için emin olun! (Yeterince sık bu stres olamaz)

Eğer gönderme konum nesne gelecekte özelliklerine (, yuvalama düşünüyorum değerler vb gibi dizileri) düz bir liste daha karmaşık hale gelebilir, önce istemci tarafında bir JavaScript nesnesi oluşturmak ve içine JSON olarak sonrası olabilir Tek bir parametre. Sonra basit bir PHP nesnesine json dize serisini. PHP 5 + dahili JSON serisini kaldırma desteği. JSON kullanarak size bir nesne olabilir ne kadar karmaşık esnek olmasını sağlayacak.