Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php _set(),_get与简单设置,get函数之间的区别_Php_Oop_Magic Methods - Fatal编程技术网

php _set(),_get与简单设置,get函数之间的区别

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-

我不确定在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->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 )