1

オーバーフロー __set および __get メソッドを使用していますが、プライベート/パブリック クラス変数をエミュレートできるようにしたいと考えています。

これに対する答えはすでに出ていると確信していますが、掘り下げていて、何も見つかりません。私がやろうとしていることの線に沿った例を示してみましょう。

<?php
class Person
{
    public function test()
    {
        return $this->whereami();
    }

    public function whereami()
    {
         if (method_called_inside_class()) {
             return 'private';
         } else {
             return 'public';
         }
    }
}

$person = new Person();
$person->test(); // 'private'
$person->whereami(); // 'public'

私が望むのは、オブジェクト内で呼び出されたときと、外部から呼び出されたときのメソッドの機能が異なることです。別の引数を追加して、動作の変更を通知したり、別の関数を作成したりできることはわかっています。しかし、私がここでやろうとしていることが、他の 2 つのオプションの代わりに何らかの方法で可能であれば、それは素晴らしいことです!

4

1 に答える 1

0

私が正しく理解していれば、コードで明示的に定義されていないが使用できるオブジェクト変数を使用する必要があります。それらのいくつかでは、魔法のゲッターとセッターは変数を返しますが、他のものではそうではありません。

これを仮定すると、次のことを行うことで問題を部分的に解決できます。クラス内では、変数に直接アクセスする必要があります$this->data['name'];。あなたが探しているものの100%ではないことはわかっていますが、クラス内からの呼び出しとクラス外からの呼び出しを実際に区別できるとは思いません。使用した関数は存在しません。

<?php

class MagicGetterSetter {
    // contains the variables
    private $data = array();

    private $publicVariables = array('test', 'foo', 'hierarchy');

    public function __get($name) {
        if (isset($this->data[$name])) {
            if (in_array($name, $this->publicVariables)) {
                return $this->data[$name];
            }
        }

        return null;
    }

    public function __set($name, $value) {
        if (in_array($name, $this->publicVariables)) {
            $this->data[$name] = $value;
        }
    }

    public function __isset($name) {
        if (in_array($name, $this->publicVariables)) {
            return isset($this->data[$name]);
        }

        return false;
    }
}
于 2013-07-25T13:02:32.453 に答える