gpt4 book ai didi

PHP 魔术方法 __set 和 __get

转载 作者:可可西里 更新时间:2023-10-31 23:59:33 31 4
gpt4 key购买 nike

这样做会被认为是好的做法吗...

我的 A 类具有以下定义:

 class A{
private $_varOne;
private $_varTwo;
private $_varThree;
public $varOne;


public function __get($name){

$fn_name = 'get' . $name;

if (method_exists($this, $fn_name)){
return $this->$fn_name();
}else if(property_exists('DB', $name)){
return $this->$name;
}else{
return null;
}
}

public function __set($name, $value){

$fn_name = 'set' . $name;

if(method_exists($this, $fn_name)){
$this->$fn_name($value);
}else if(property_exists($this->__get("Classname"), $name)){
$this->$name = $value;
}else{
return null;
}

}

public function get_varOne(){
return $this->_varOne . "+";
}


}

$A = new A();
$A->_varOne; //For some reason I need _varOne to be returned appended with a +

$A->_varTwo; //I just need the value of _varTwo

为了不创建 4 个 set 和 4 个 get 方法,我使用了魔术方法来为我需要的属性调用受人尊敬的 getter,或者只返回属性的值而不做任何更改。这可以被认为是好的做法吗?

最佳答案

不知道最佳实践,但是当您需要延迟加载属性时,__get 会非常有用,例如获取它时涉及复杂的钙化或数据库查询。此外,php 提供了一种优雅的方式来缓存响应,只需创建一个具有相同名称的对象字段,从而防止再次调用 getter。

class LazyLoader
{
public $pub = 123;

function __get($p) {
$fn = "get_$p";
return method_exists($this, $fn) ?
$this->$fn() :
$this->$p; // simulate an error
}

// this will be called every time
function get_rand() {
return rand();
}

// this will be called once
function get_cached() {
return $this->cached = rand();
}
}

$a = new LazyLoader;
var_dump($a->pub); // getter not called
var_dump($a->rand); // getter called
var_dump($a->rand); // once again
var_dump($a->cached); // getter called
var_dump($a->cached); // getter NOT called, response cached
var_dump($a->notreally); // error!

关于PHP 魔术方法 __set 和 __get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110640/

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