php __set(),__ get和简单的seting,获取函数之间的区别

Axe*_*eem 4 php oop magic-methods

我不确定在PHP 中使用__get__set方法有什么价值.

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

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';
Run Code Online (Sandbox Code Playgroud)

这是另一个代码.

 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');
Run Code Online (Sandbox Code Playgroud)

这两个函数都做同样的事情.

代码使用__get/ __setmagic方法:

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');
Run Code Online (Sandbox Code Playgroud)

如你所见,这两个功能都做同样的工作.

我很困惑为什么PHP开发人员会使用魔术方法__get/ __set何时可以自己实现?

我确信它们有一些用处,但我必须遗漏一些东西.

Rob*_*ert 12

这不是关于他们做什么,而是关于什么时候被调用.

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

__get() is utilized for reading data from inaccessible properties.
Run Code Online (Sandbox Code Playgroud)

所以,如果你想

echo $object->propertDoesnExists; //it will call get
Run Code Online (Sandbox Code Playgroud)

但是这个

$object->propertDoesnExists = 1; //it will call set
Run Code Online (Sandbox Code Playgroud)

使用get的很好的例子,并设置方法是这里

使用MagicMethods可以使代码更容易阅读和更短.

有更多有趣的MagicMethods

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