Using __get() (magic) to emulate readonly properites and lazy-loading

后端 未结 4 989
北荒
北荒 2021-02-19 12:46

I\'m using __get() to make some of my properties \"dynamic\" (initialize them only when requested). These \"fake\" properties are stored inside a private array property, which I

4条回答
  •  爱一瞬间的悲伤
    2021-02-19 13:14

    Using __get() is said to be a performance hit. Therefore, if your list of parameters is static/fixed and not terribly long, it would be better performance-wise to make methods for each and skip __get(). For example:

    public function someobject() {
        if(!($this->props[$name] instanceof Someobject))
            $this->props[$name] = new Someobject;
            // do stuff to initialize someobject
        }
        if (count($argv = func_get_args())) {
            // do stuff to SET someobject from $a[0]
        }
        return $this->props['someobject'];
    }
    

    To avoid the magic methods, you'd have to alter the way you use it like this

    $bar = $foo->someobject; // this won't work without __get()
    $bar = $foo->someobject(); // use this instead
    
    $foo->someobject($bar); // this is how you would set without __set()
    

    EDIT

    Edit, as Alex pointed out, the performance hit is millisecond small. You can try both ways and do some benchmarks, or just go with __get since it's not likely to have a significant impact on your application.

提交回复
热议问题