gpt4 book ai didi

php - __set 和 __get 方法在类内外的行为是否不同?

转载 作者:可可西里 更新时间:2023-11-01 01:01:31 25 4
gpt4 key购买 nike

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

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

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

我以为我可以使用 PHP 神奇的 __set__get 方法,但我的输出不是预期的。下面是我的类(class)、示例和结果:

类:

    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 函数)?

非常感谢!

最佳答案

神奇的 __get 和 __set 方法仅在访问未显式声明的属性时调用。您的代码如所示那样工作的原因是 $session_namespace 只是另一个未声明的属性,因此设置它会调用 __set,而不管该调用是在何处进行的。

因此,您需要做的是在您的类定义中添加一行声明该属性,例如 private $session_namespace(不管它是公共(public)的、 protected 还是私有(private)的,但是一般规则是先限制事物,只有在需要时才放宽限制。

PHP 将看到声明的属性,将其设置为普通变量,并且不调用 __set,而任何其他名称仍将调用魔法方法。作为奖励,当从公共(public)上下文调用时,私有(private)或 protected 变量将被视为不存在,因此如果您出于某种原因想要设置 $_SESSION['testing']['session_namespace'] 甚至应该是可能的。

关于php - __set 和 __get 方法在类内外的行为是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24107729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com