Home > Design Patterns, PHP > Lazy initialization is the tactic of del…

Lazy initialization is the tactic of del…

Lazy initialization is the tactic of delaying the creation of an object, the calculation of a value, or some other expensive process until the first time it is needed.

In a software design pattern view, lazy initialization is often used together with a factory method pattern. This combines three ideas:

  • using a factory method to get instances of a class (factory method pattern)
  • storing the instances in a map, so you get the same instance the next time you ask for an instance with same parameter (compare with a singleton pattern)
  • using lazy initialization to instantiate the object the first time it is requested (lazy initialization pattern).

A Simple PHP Example

class User{
    protected $_id;
    public function getId(){
        return $this->_id;
    }
}
class Post{
    protected $_userId;
    protected $_text;
    /**** @var User*/
    protected $_user;
    public function setUser(User $user){
        $this->_userId = $user->getId();
        $this->_user = $user;
    }
    public function getUser(){
        if (!$this->_user) {
            $this->_user = new User($this->_userId);
        }
        return $this->_user;
    }
    public function setText($text){
        $this->_text = $text;
    }
    public function getText(){
        return $this->_text;
    }
}

A PHP 5 Example

class View{
    protected $_values = array();
    public function set($name, $value){
        $this->_values[$name] = $value;
    }
    public function render($file){
        extract($this->_values);
        ob_start();   include($file);
        return ob_get_clean();
    }
}
class Page{
    /*** View object.** @var View*/
    protected $_view;
    public function __construct(){
        // remove attribute to use the __get magic method in first access
        unset($this->_view);
    }
    public function __get($name){
        if ($name == '_view') {       // load view object
            $this->_view = new View();
            return $this->_view;
        }
    }
    public function actionIndex(){
        $this->_view->set('title', 'Lazy Initialization');
        print $this->_view->render('lazy.tpl');
    }
}
  1. No comments yet.
  1. No trackbacks yet.