私は彼が配列を使用する方法を得ることはありませんここに。
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}
も消えます。動的プロパティへのアクセスにはユースケースがありますが、私はこれを(あなたが投稿した元のコード)その一つだとは思わない。
コードの説明を求める質問が[so]で受け入れられないため、私はこのトピックをオフトピックとして閉じるよう投票しています。 –