2013-10-08 2 views
0

나는 나 자신이 많은 일 참조 :이 값을 초기화하는 데 사용되는 epxensive 논리를 피할 수 있기 때문에강제로 메모를 작성해야합니까?

function getTheProperty() 
{ 
    if (! isset($this->theproperty)) { 
     $property = // logic to initialise thepropery 
     $this->theproperty = $property; 
    } 
    return $this->theproperty; 
} 

이 좋다. 그러나, 지금까지 내가 볼 수있는 단점은 클라이언트가 이것을 어떻게 사용할 것인지 정확하게 결정할 수없고 혼란 스러울 수 있다는 것입니다.

사용하기에 좋은 패턴입니까? 이 작업을 수행 할 때 고려해야 할 사항은 무엇입니까?

memoization을 우회하는 매개 변수 - 예를 들어 $ forceNew를 추가하는 방법은 어떻습니까?

답변

0

Magic Methods. 예 :

Class MyMagic { 

    private $initinfo = array(
    'foo' => array('someFunction', array('arg1', 'arg2')) 
    'bar' => array(array($this, 'memberFunction'), array('arg3')) 
); 

    public function __get($name) { 
    if(! isset($this->$name)) { 
     if(isset($this->initinfo[$name])) { 
     $this->$name = call_user_func_array(initinfo[$name][0], initinfo[$name][1]); 
     } else { 
     throw new Exception('Property ' . $name . 'is not defined.'); 
     } 
    } else { 
     return $this->$name; 
    } 
    } 

} 

$magic = new MyMagic(); 
echo $magic->foo; //echoes the return of: someFunction('arg1', 'arg2') 
echo $magic->bar; //echoes the return of: $this->memberFunction('arg3') 
+0

값을 초기화하는 데 많은 작업/시간이 소요된다는 점에서 비용이 많이 듭니다. 아마도 대용량 db 읽기, API 호출 등. –

+0

코드 예제에별로 관심이 없습니다. 죄송합니다. –

+0

@ MartyWallace 예. 나는 memoization에 대해 읽었을뿐입니다. [나는 그것이 오타라고 생각했습니다.]이 대답을 다시 써 보겠습니다. – Sammitch

관련 문제