php _set(),_get与简单设置,get函数之间的区别
我不确定在PHP中使用php _set(),_get与简单设置,get函数之间的区别,php,oop,magic-methods,Php,Oop,Magic Methods,我不确定在PHP中使用\uuu get和\uu set方法的价值是什么 下面是在数组中设置值的代码 class myclass { public $sotre = array(); public function __set($arraykey,$value){ echo 'Setting '.$arraykey.' to '.$value; $this->store[$arraykey] = $value; } } $obj = new myclass; $obj-
\uuu get
和\uu 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';
这是另一个代码
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');
这两个函数做相同的事情
使用\uuuu get
/\uuu 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');
class-myclass{
公共$store=
排列(
“a”=>“arfan”,
“b”=>“azeem”,
“c”=>“hader”
);
公共功能(arraykey){
回显“获取数组键”。$arraykey。“
”;
如果(数组\键\存在($arraykey,$this->store)){
返回$this->store[$arraykey];
}
}
公共函数getvalue($arraykey){
回显“获取数组键”。$arraykey。“
”;
如果(数组\键\存在($arraykey,$this->store)){
返回$this->store[$arraykey];
}
}
}
$obj=新的myclass;
echo$obj->a;
$obj=新的myclass;
echo$obj->getvalue('a');
正如您所看到的,这两个函数做相同的工作
我不明白为什么PHP开发人员会使用神奇的方法\uuu get
/\uu 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方法的一个很好的例子是
使用MagicMethods可以使代码更易于阅读和缩短
还有更有趣的
我还注意到您使用的是公共的
$store
数组!这毫无意义。如果将其标记为公共,则无需使用方法即可访问。这不是重点。当您使用方法或魔术方法来获取/设置变量时,这是因为方法在您想要分配或获取变量时为您提供了更好的控制,您可以进行一些验证、检查错误等。将变量公开是一种非常糟糕的惯例。在项目的每个地方,都可以在类外访问公共成员,如果出现错误,需要检查大量代码,当通过方法访问的私有成员出现问题时,可能只有2个方法需要检查(get/set)。因为已经告诉了区别,我将尝试解释其目的
这些神奇的功能实际上是为了清除一些代码。有些人认为调用$object->property
比调用$object->getProperty()
更清晰
当您使用链接时会更清楚,例如:object->getDatabase()->getTable()->getRow()->getType()->convertToString()->makeUppercase()
等。使用“隐藏属性”更清楚
使用magic方法并不能解决某些问题(比如通过引用调用),但有时它更容易阅读
在某些语言(如Object Pascal,即Delphi或FreePascal)中,使用属性非常流行,在这些语言中,您的类可以具有以下内容:
property count: Integer read getCount write getCount;
其中getCount()
和setCount()
都是私有的或受保护的。编码人员可以把它们当作变量来考虑,但是方法被调用了
在PHP中,\uu get()
(和\uu set()
)魔术方法也有一些优点。通常,当您调用不存在的属性时,会发出通知。但是如果您实现了\uuu get()
方法,则不会给出任何通知,您可以编写\uu get()
方法,例如,在属性不存在的任何情况下返回NULL
,或者处理错误或其他任何情况
关于这会有什么危险(但也有可能),请看最后一个例子。这种神奇的方法就像捷径一样。其他语言,如Python、C#和Ruby也实现了这一特性 我认为当您需要将PHP代码放入HTML模板中时,这更有用:
foreach($items as $item):
?>
<li>
Title: <?php echo $item->getTitle(); ?> <br/>
Description: <?php echo $item->getLongDescription(); ?> <br/>
URL: <?php echo $item->getAbsoluteUrl(); ?> <br/>
</li>
<?php
endforeach;
foreach($items作为$item):
?>
标题:
说明:
URL:
标题:
说明:
URL:
将数据写入无法访问的属性时,将运行\u set()
\uu get()
用于从无法访问的属性读取数据
前
前
$obj->a
比$obj->getvalue('a')
更具可读性。注意,MagicMethods的新链接是:
foreach($items as $item):
?>
<li>
Title: <?php echo $item->title; ?> <br/>
Description: <?php echo $item->longDescription; ?> <br/>
URL: <?php echo $item->absoluteUrl; ?> <br/>
</li>
<?php
endforeach;
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )