0

変更中の変数が抽象クラスで宣言されている場合に抽象クラスの __set メソッドを実行し、変更中の変数が抽象クラスを拡張するクラスに属している場合は別の __set を実行する方法はありますか。私はこれについて間違った方法で行っていると確信しています。

abstract class abstract_class {
    protected $protected_var;

    function __set($name, $value)
    {
        echo "abstract __set";
    }
}

class regular_class extends abstract_class {
    private $temp;

    function __set($name, $value)
    {
        echo "regular __set";
    }
}

$class = new regular_class();
$class->protected_var = "value";

上記の例では、「通常の __set」が出力されるのではなく、「抽象 __set」が出力されるようにします。

4

1 に答える 1

2
class Base
{
    protected $a = "a";

    public function __set($name, $value)
    {
        echo "base";
    }
}

class Child extends Base
{
    private $b = "b";
    public function __set($name, $value)
    {
        if (property_exists(get_parent_class(), $name))
            parent::__set($name, $value);
        else
            echo "child";
    }
}

$obj = new Child();

$obj->a = 1;
$obj->b = 1;

ここに解決策があります

クラスの子を作成して __set をオーバーロードしたい場合は常に、最初にプロパティが親クラスにあるかどうかを確認する必要があることを覚えておいてください。そうしないと、正しく機能しません

于 2013-08-04T22:18:21.667 に答える