4

これは非常に具体的な問題であり、どこにも答えが見つかりません。これは多くの言語に当てはまりますが、私は特に PHP でそれを理解したいと思っています。このために、「イベント」をクラスとして使用します。簡単に言うと2種類あります。

abstract class Event{
    protected $cost;
    protected $startTime;

    public function __construct(){
        foreach($eventData as $key => $val){
            if(property_exists($this, $key)){
                $this->$key = $val;
            }
        }
    }
}

class Party extends Event{
    private $hasPointyHats;

    public function __construct($eventData){
        parent::__construct($eventData);
        $this->hasPointyHats = $eventData->hasPointyHats;
    }
}

クラス Event には、cost と startTime の 2 つの props があります。構築時に、イベントのすべてのパラメーターを含む連想配列を渡す必要があり、渡された配列値にプロパティが自動的に設定されます。

Class Party は、このイベントに素晴らしい先のとがったパーティー ハットがあるかどうかを確立することで、Event を拡張します (ない場合は行きません)。

いいえ。いいえ、そうではありません。このオブジェクトを渡すと、次のようになります。

//Some result set...
$mysqli_result = $result->fetch_assoc();

cost、startTime、および hasPointyHats の値 (おそらくそれ以上) を持つ場合、次の小さなエラーが発生します。

Fatal error: Cannot access private property Party::$hasPointyHats in C:\somePath\Event.php on line 35

理由はわかりました。「イベント」では、 $this は「パーティー」オブジェクトを参照しますが、プライベートであるためです。スーパー コンストラクター内のオブジェクトのすべてのプロパティを上書きしようとしているわけではなく、スーパー クラス (抽象クラス Event) 自体に属するものだけを上書きしようとしています。子クラスのプロパティではなく、Event クラスの特定のプロパティをターゲットにする方法はありますか? そうすれば、どのオブジェクトを拡張しても、渡されたオブジェクトに競合するプロパティがあったために、誤って子クラスにプロパティを設定してしまうことはありませんか?

super->property などのばかげた簡単なものだと思いますが、それで property_exists を使用できるようにする必要があります。

事前に助けてくれてありがとう。

4

2 に答える 2

2

オブジェクトの代わりにクラス名だけで property_exists を使用できます。このような:

abstract class Event{
protected $cost;
protected $startTime;

public function __construct($eventData){
    foreach($eventData as $key => $val){
        if(property_exists(__CLASS__, $key)){
            $this->$key = $val;
        }
    }
}
}
于 2013-06-20T05:52:29.543 に答える
1

property_exists()PHP 5.3 の時点で、アクセシビリティに依存しないプロパティの存在をチェックすることがドキュメントに具体的に記載されています。

get_object_vars()一方、 はscopeで定義されたプロパティのリストを取得するため、目的により適切に機能するはずです。

次のようなことを試してください:

public function __construct() {
    $props = get_object_vars($this);
    foreach ($eventData as $key => $val) {
        if (array_key_exists($key, $props)) {
            $this->$key = $val;
        }
    }
}

これは、それが親クラスのプロパティであることを明確にチェックするのではなく、親クラスからアクセスできることだけを確認します。

本当に親クラスだけに制限したい場合は、get_class_vars()さらに良いかもしれません:

public function __construct() {
    $props = get_class_vars(__CLASS__);
    foreach ($eventData as $key => $val) {
        if (array_key_exists($key, $props)) {
            $this->$key = $val;
        }
    }
}
于 2013-06-20T05:47:31.213 に答える