我需要来自对象的一些数据 我不希望这些数据在类构造中加载,因为它是db重的 我不想在页面中多次加载它 我不想记得是否已加载它。
$object->data // should be loaded in construction
$data = $object->get_data() // ok, but I need to remember was is got already, or not.
有没有办法使用$object->data
,如果第一次询问,它实际上获取数据并将其返回。当我在此之后问它时,它只返回旧数据
如果没办法,我会使用$data = $object->get_data()
。但也许我错过了一些东西。
答案 0 :(得分:1)
你所谈论的事情被称为Lazy Loading。您应该在方法get_data()中实现它。如果您想将它用作属性而不是方法,则必须使用PHP的魔术__get
方法并在访问data
属性时返回数据。
但我建议使用方法 - 它更明确。
答案 1 :(得分:1)
这通常使用“延迟加载”来解决 - 属性本身使用私有字段进行备份,私有字段在构造函数中初始化为某个魔术值(例如null
),并在第一次获取时被填充被叫。之后,getter返回已经加载的值。例如:
class Foobar {
private $_lazy;
public function __construct() {
$this->_lazy = null;
}
public function __get($key) {
switch ($key) {
case 'lazy':
if ($this->_lazy === null)
$this->loadLazy();
return $this->_lazy;
}
}
private function loadLazy() {
$this->_lazy = rand();
}
}
答案 2 :(得分:1)
嗯,你可以这样做
//create an object
class Foo{
//give some attributes
public $attr1;
public $attr2;
public $attr3;
public $attr4;
....
....
//create a function to load data
public function foofunction()
{
//and set the attrs
$this->attr1 = $somevalue;
$this->attr2 = $somevalue;
$this->attr3 = $somevalue;
//...
....
}
}
and you in your page
//create an object
$foo = new Foo();
//fetch data which will instantiate the attrs
$foo->foofunction();
//and you can use any attr at any time
echo $foo->attr1;
echo $foo->attr2;
//and this attr necessarily does not have to string, or int or ..
//it can be anything
答案 3 :(得分:0)
对象有一个属性 - 标志,表示之前是否有人询问过数据。
答案 4 :(得分:0)
这是延迟加载
// simple implementation
public function get_data() {
if (is_null($this->_data)) {
$this->_data = $db->query();
}
return $this->_data;
}