2017-02-07 6 views
-1

配列が提供されているときに、指定されたクラスから新しいインスタンスを取得する方法はありますか? function foo($array, $class){return "new instance of class with prefilled member variables"}のようなもの?PHP配列からクラスの新しいインスタンスを取得する(POST経由で投稿)

PDOでは、PDOStatement :: fetchの定数PDO :: FETCH_CLASSを使用して、取得したデータでいっぱいになったクラスの新しいインスタンスを取得できます。私はこのためにそれを使用したい

  1. ユーザーが(例えば、フィールドfirstnamelastnameと値「人」との隠しフィールドで)HTMLフォームを提出しました。
  2. 私は$ _POST(適切なフィルタリング/サニタイズを伴う)でフォームデータを取得します。
  3. このデータを正しいクラス(この例ではPerson)のインスタンスに「変換する」必要があります。

これを行う方法はありますか、自分のクラス(すべてのクラスについて)を書く必要はありますか?

+0

@MASIDDIQUI私はプログラマーですから、私は一番簡単な方法を望んでいます:PIは多くのクラスを持っていますPDOはそれを持っているので(これはどこかに存在するので)、これにはすでに汎用的な方法がありました。だから、車輪を再構築するのではなく、すでに誰かがそれをしているかどうかを知りたかったのです。 –

+0

"すべてのクラス"ではなく、イントロスペクションを使用する関数を作成し、指定されたクラスのすべてのプロパティ名をポストデータの各フィールドに一致させようとします。すべてが一致する場合は、代入を行い、インスタンスを返します。 – Petruza

+1

これは非常に主観的ですが、 'MVC'と' REST' APIを調べることを提案します。あなたの 'controller(s)'は '$ _POST'リクエストを処理します。適切な'モデル '(オブジェクト)と' view'(レスポンス)の作成をプログラムしますが、RESTではルートを特定のコントローラメソッドを呼び出す。具体的なユースケースの参考になるのは、 'composer.phar'がPHPフレームワーク(Symfony、CodeIgniter)のようにより高度な'オートローダー(autoloader) 'やそれ以上のものを作成する方法を見てみることです。 – fyrye

答えて

1

このように簡単なことを書くことができます。クラスを$ _POSTからロード可能にする場合は、拡張可能な基本クラスを作成します。

その後、あなたはまた、形質としてこの余分な機能を書くことができる$ _POSTや$ _GET配列

class Base { 

    public function load_post($post) 
    { 
     foreach ($post as $field=>$val){ 
      if (property_exists($this, $field)){ 
       $this->{$field} = $val; 
      } 
     } 
    } 
} 

class Person extends Base 
{ 
    public $one; 
    public $two; 
    public $three; 

    public function __construct($vars) 
    { 
     if (isset($vars)){ 
      parent::load_post($vars); 

     } 
    } 
} 

// pseodo $_POST array 
$form_vars = ['one'=>1, 'two'=>2, 'three'=>3]; 

$p = new Person($form_vars); 
print_r($p); 

結果

Person Object 
(
    [one] => 1 
    [two] => 2 
    [three] => 3 
) 

からクラスに存在するものだけをロードするための簡単なforeachの

trait load_post { 

    public function load_post($post) 
    { 
     foreach ($post as $field=>$val){ 
      if (property_exists($this, $field)){ 
       $this->{$field} = $val; 
      } 
     } 
    } 
} 

class Person 
{ 
    use load_post; 

    public $one; 
    public $two; 
    public $three; 

    public function __construct($vars) 
    { 
     if (isset($vars)){ 
      $this->load_post($vars); 

     } 
    } 
} 

// pseodo $_POST array 
$form_vars = ['one'=>1, 'two'=>2, 'three'=>3]; 

$p = new Person($form_vars); 
print_r($p); 
+0

このようなものがなかったなら、私が念頭に置いていたものでした。コードをありがとう、それは本当に簡単です。唯一の欠点は、すべてのクラスがBaseクラスを拡張する必要があることです(本当にうまく見えず、可能であればきれいなコードを書くのが好きです)。私はこれを今晩までの回答として受け入れて、他の人が反応できるように待つつもりです。 –

+0

TRAITの使用をお勧めしますか – RiggsFolly

+0

個人的に私はほとんど常に空のBASEクラスから始めます。ほとんどの場合、プロジェクトの途中で何かが起こり、避けられないスコープのクリープが噛み付いたときに本当に役に立ちます。 – RiggsFolly