当第一次询问对象属性获取数据,然后只返回它时 - 是否可能?

时间:2011-02-07 09:09:37

标签: php oop

我需要来自对象的一些数据 我不希望这些数据在类构造中加载,因为它是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()。但也许我错过了一些东西。

5 个答案:

答案 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;
}