- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不确定在 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/
我目前正在制作一个基于对象的 API。我有一个名为 Part 的抽象类,每个 child 都会扩展它。 Part 有一个 __set 函数,它将值存储在一个名为 $attributes 的 prote
我是 php 世界的新手。我试图了解 __set() 魔术方法在 php 中的工作原理。这里我使用 __set() 创建一个新属性__set() em> 方法。我有一个 if 语句,用于检查该属性是否
这设法在对象上创建一个新属性。但是,有人可以通过支持链接解释为什么 setAttrib 有两种不同的行为方式吗?为什么它不会导致……等等……堆栈溢出!!?? class Test { public
我正在尝试为类设置一个不明确的变量。沿着这些线的东西: values[$key]; } function __set($key, $value){ $this->value
任何人都可以向我解释这种行为的逻辑吗? 考虑以下情况: class EPPDomain { protected $myField; public static function bui
class Dog { protected $bark = 'woof!'; public function __get($key) { if (isset($this
想知道是否可以执行以下操作(我知道代码不会按预期工作,只是试图达到目的): class Form { private $v = array(); function __set($var
我正在构建一个包含多个输入验证的类,我决定将它们放在 __set 方法中(我不确定这是否是正确的形式,因为我的 OOP 经验有限)。这似乎工作正常,当从类外部传递无效值时抛出正确的错误。但是,如果在类
我在玩弄 PHP 魔法方法(特别是 Property overloading ),并且在进行微基准测试时,遇到了一个我无法解释的怪癖: 看起来一个空体的__set方法比一个有效的方法需要更多的时间来运
如果我有以下注册表类: Class registry { private $_vars; public function __construct() { $th
我正在使用 PHP 实现 OOP 设计。我想知道 PHP 如何处理其神奇方法(如 __get 和 __set)的继承。 class Foo { protected $property1;
我不确定在 PHP 中使用 __get 和 __set 方法有什么值(value)。 这是在数组中设置值的代码。 class myclass { public $sotre = array(); pu
这个问题在这里已经有了答案: PHP Inherited parent method can't access child's private property (3 个答案) 关闭 9 年前。 $
经过一些研究,我最终找到了一个我很快就会在这里问的问题的答案;您如何通过 PHP 中的 __get 和 __set 魔术方法处理数组?每当我尝试使用类似 $object->foo['bar'] = 4
我有一个定制的 MVC PHP 框架,我正在重写它并且对性能和魔术方法有疑问。对于框架的模型部分,我在想如果 __get/__set 魔法方法会导致太多的性能损失而不值得使用。我的意思是访问(读取和写
我正在研究 PHP 中的 OOP,并尝试编写一个基本的 Session 类,它将创建一个 Session 数组。在实例化类时,用户将提供数组的第一维,然后我希望他们能够向该 session 添加任何变
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
PHP 5 引入了魔术方法 __get() 和 __set()。根据我的理解,这是必须编写每个成员的 getter 和 setter 的捷径; $var = $name; } fun
在 OO 编程中,使用魔法方法 __get() 和 __set() 会不会被人看不起,这些会导致类的封装泄漏吗?例如: class User { private $username;
这样做会被认为是好的做法吗... 我的 A 类具有以下定义: class A{ private $_varOne; private $_varTwo; priva
我是一名优秀的程序员,十分优秀!