2016-07-03 17 views
-1

誰かが私にこのコードを説明することができますしてください:

<?php 

class Model 
{ 

    protected $dates = []; 

    public function __get($property) 
    { 
     if (in_array($property, $this->dates)) { 
      return new DateTime($this->{$property}); 
     } 

     return $this->{$property}; 
    } 

} 

class User extends Model 
{ 
    protected $dates = ['createdAt']; 

    protected $createdAt = '2016-01-01 12:35:15'; 
} 

class Comment extends Model 
{ 
    protected $dates = ['createdAt']; 

    protected $createdAt = '2016-01-01 12:35:15'; 
} 

$comment = new Comment; 

var_dump($comment->createdAt->format('H:i')); 

私は彼がここに配列を使用する方法を得ることはありません。彼は$ propertyを使って配列のインデックスにアクセスしていますか?そして、$ this - > {$ property}はどのように機能しますか?

おかしいが、それはただの初心者の例ですが、私は、このコードを理解していない...

敬具、 ミラノ

+4

コードの説明を求める質問が[so]で受け入れられないため、私はこのトピックをオフトピックとして閉じるよう投票しています。 –

答えて

3

私は彼が配列を使用する方法を得ることはありませんここに。

He /彼女はdatesアレイを使用して、日付プロパティ値を適切なDateTimeオブジェクトに自動変換します。プロパティが$this->dates配列内の要素の1つと一致する場合、プロパティ値はDateTimeの値として返されます。そうでない場合、通常のプロパティ値が返されます。

$ this - > {$ property}はどのように機能しますか?

これはゴミコードカントーあるオブジェクト

// let's say $property is set to 'foo' 
$this->{$property} 

// is the same as 
$ths->foo 

上のダイナミックプロパティにアクセスする方法です。

プロパティの動的取得/設定は、特定のプロパティが特別な方法で動作することを意味します。 モデルのプロパティが追加されると、それらはPHP クラスプロパティにもリークします。それは災害のためのレシピです。ここで

がより良いコードの例です

class Util { 
    static public function datetime($str) { 
    return new DateTime($str); 
    } 
} 

class Model { 
    protected $attributes = []; 

    protected $map_attributes = []; 

    public function __construct($attributes = []) { 
    $this->attributes = $attributes; 
    } 

    public function __set($property, $value) { 
    $attributes[$property] = $value; 
    } 

    public function __get($property) { 
    if (!array_key_exists($property, $this->attributes)) 
     return null; 
    elseif (array_key_exists($property, $this->map_attributes)) 
     return call_user_func($this->map_attributes[$property], $this->attributes[$property]); 
    else 
     return $this->attributes[$property]; 
    } 
} 

class User extends Model { 
    protected $map_attributes = [ 
    'created_at' => ['Util', 'datetime'] 
    ]; 
} 

$u = new User(['foo' => 'bar', 'created_at' => '2016-01-01 12:35:15']); 

echo $u->foo, PHP_EOL;      // bar 
echo $u->created_at->format('H:i'), PHP_EOL; // 12:35 

Run this code at REPL.it

今、すべてを取得/設定モデルプロパティがうまく単一$this->attributes Arrayクラスプロパティにサンドボックス化されています。これにより、プロパティがすべてModelまたはサブクラスModel以上になることがなくなります。

また、各クラスは、$this->map_attributesに適切なマッピング関数を設定することによって、任意のプロパティを別の値に任意にマップできます。つまり、サブクラスが別の型を返す必要があるときに、新しいプロパティ - >値マッピングをサポートするためにModel::__getを更新する必要はありません。

したがって、醜くて危険な$this->{$property}も消えます。動的プロパティへのアクセスにはユースケースがありますが、私はこれを(あなたが投稿した元のコード)その一つだとは思わない。