__set和__get方法可以在类的内部和外部表现不同吗?

时间:2014-06-08 15:31:19

标签: php oop session

我正在使用PHP中的OOP,我正在尝试编写一个基本的Session类,它将创建一个Session数组。在实例化类时,用户将提供数组的第一个维度,然后我希望它们能够向该Session添加任何变量/值组合。举个例子:

$session = new My_Session('testing');
$session ->boy = 'girl';

应该等同于输入$_SESSION['testing']['boy'] = 'girl';

我认为我可以使用PHP的魔术__set__get方法,但我的输出不是预期的。下面我有我的课,一个例子和我的结果:

班级:

    class My_Session {
    function __construct($session_namespace) {

    $this->session_namespace = $session_namespace;
}


     public function __set($name, $value) {

   $_SESSION[$this->session_namespace][$name] = $value;


     }

     public function __get($name){

         return $name;


        }
}

测试:

$session = new My_Session('testing');
$session ->boy = 'girl';
$session ->cow = 'blah';

print_r($_SESSION);

$session2 = new My_Session('testing2');
$session2 ->boy = 'girl2';
$session2 ->cow = 'blah2';

print_r($_SESSION);

时髦的结果:

  Array
(
    [session_namespace] => Array
        (
            [session_namespace] => testing
            [boy] => girl
            [cow] => blah
        )

)
Array
(
    [session_namespace] => Array
        (
            [session_namespace] => testing2
            [boy] => girl2
            [cow] => blah2
        )

)

我想象的是我的__set和__get方法在类之外以及类内定义方式相同;反正是为了避免这种情况,以便我可以保留用户实例化类的$session->boy = 'girl'语法,但同时让$this->session_namespace = $session_namespace在类中正确行为(即如果我没有'是否有自定义__get__set功能)?

非常感谢!

1 个答案:

答案 0 :(得分:3)

只有在访问尚未显式声明的属性时,才会调用magic __get和__set方法。您的代码如图所示工作的原因是$ session_namespace只是另一个未声明的属性,因此无论调用的位置如何,都将其设置为__set。

因此,您需要做的是添加一行,将该属性声明为您的班级定义,例如private $session_namespace(如果它是公共的,受保护的或私有的,则无关紧要,但一般规则是先限制事物,只在需要时放宽限制。

PHP将看到声明的属性,将其设置为普通变量,而不是调用__set,而任何其他名称仍将调用魔术方法。作为奖励,当从公共环境调用时,私有或受保护变量将被视为不存在,因此甚至可以设置$ _SESSION [' testing'] [' session_namespace&#39 ;]如果你出于某种原因想要。