gpt4 book ai didi

php - php __set()、__get和简单设置、获取函数的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:57:51 26 4
gpt4 key购买 nike

我不确定在 PHP 中使用 __get__set 方法有什么值(value)。

这是在数组中设置值的代码。

class myclass {
public $sotre = array();

public function __set($arraykey,$value){
echo 'Setting '.$arraykey.' to '.$value;
$this->store[$arraykey] = $value;
}
}

$obj = new myclass;
$obj->a = 'arfan';

这是另一个代码。

 class myclass {
public $sotre = array();

public function setvalue($arraykey,$value){
echo 'Setting '.$arraykey.' to '.$value;
$this->store[$arraykey] = $value;
}
}

$obj = new myclass;
$obj->setvalue('a','arfan');

两个函数做同样的事情。

使用__get/__set 魔术方法的代码:

class myclass {
public $store =
array(
'a'=>'arfan',
'b'=>'azeem',
'c'=>'hader'
);

public function __get($arraykey){
echo 'Getting array key '.$arraykey.'<br />';
if(array_key_exists($arraykey,$this->store)){
return $this->store[$arraykey];
}
}

public function getvalue($arraykey){
echo 'Getting array key '.$arraykey.'<br />';
if(array_key_exists($arraykey,$this->store)){
return $this->store[$arraykey];
}
}
}

$obj = new myclass;
echo $obj->a;

$obj = new myclass;
echo $obj->getvalue('a');

如您所见,这两个函数执行相同的工作。

我很困惑为什么 PHP 开发人员会使用神奇的方法 __get/__set ,而它们可以自己实现?

我确定它们有一些用处,但我一定遗漏了一些东西。

最佳答案

重要的不是它们做什么,而是它们何时被调用。

__set() is run when writing data to inaccessible properties.

__get() is utilized for reading data from inaccessible properties.

所以如果你想

echo $object->propertDoesnExists; //it will call get

但是这个

$object->propertDoesnExists = 1; //it will call set

使用 get 和 set 方法的一个很好的例子是 here

使用 MagicMethods 使代码更易于阅读且更短。

还有更多有趣的 MagicMethods

我还注意到您使用了公共(public)的 $store 数组!它没有任何意义。如果您将其标记为公开,则无需使用方法即可访问它。这不是重点。当您使用方法或魔术方法来获取/设置变量时,这是因为方法可以让您更好地控制何时要分配或获取变量,您可以进行一些验证,检查错误等。将变量设为公共(public)被称为非常糟糕的约定.在项目的每个地方都可以在类之外访问公共(public)成员,如果发生错误有很多代码需要检查,当通过方法访问的私有(private)成员出现问题时可能只有 2 个方法需要检查(获取/设置)。

关于php - php __set()、__get和简单设置、获取函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646822/

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