我正在使用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
功能)?
非常感谢!
答案 0 :(得分:3)
只有在访问尚未显式声明的属性时,才会调用magic __get和__set方法。您的代码如图所示工作的原因是$ session_namespace只是另一个未声明的属性,因此无论调用的位置如何,都将其设置为__set。
因此,您需要做的是添加一行,将该属性声明为您的班级定义,例如private $session_namespace
(如果它是公共的,受保护的或私有的,则无关紧要,但一般规则是先限制事物,只在需要时放宽限制。
PHP将看到声明的属性,将其设置为普通变量,而不是调用__set,而任何其他名称仍将调用魔术方法。作为奖励,当从公共环境调用时,私有或受保护变量将被视为不存在,因此甚至可以设置$ _SESSION [' testing'] [' session_namespace&#39 ;]如果你出于某种原因想要。