2015-02-05 11 views
1

내가 아카이브하려고하는 것은 PHP에서 변수 용 오토로더의 일종입니다. 거기에 PHP에서 변수의 로딩을 연결하는 방법은 무엇입니까?PHP에서 후크 변수 호출

사용 예는 다음과 같습니다이 보관 어떤 후크

function __autoloadVar($varname,$indices){ 
    global $$varname; 

    if(count($indices) > 0 && !isset($$varname[$indices[0]])){ //first index 
     $$varname[$indices[0]] = load_var_content($indices[0]); //this would call a function that loads a variable from the database, or another source 
    } 
} 

echo $foo["bar"]["baz"]; 
// => calls __autoloadVar("foo",array("bar","baz")) then accessing it 

가?

[편집] : 사용 사례는 언어 속성로드를 리팩터링하려고하는 것입니다. 그들은 파일에 저장되어 있습니다.이 파일은 사용하지 않더라도 항상 완전히로드되기 때문에 꽤 펌핑되고 ​​메모리 집약적입니다.

모든 변수를 함수 호출로 바꾸는 것은 작동하지 않습니다. 특히 변수가 문자열에 포함되어 있으면 검색 및 바꾸기가 작동하지 않기 때문에 모든 곳을 바꿀 개월이 필요합니다.

또 다른 리팩토링은 스크립트에서 수행 할 수있는 변수를 데이터베이스로 옮기는 것입니다. 하지만 모든 변수를 한 번에로드하는로드 프로세스는 런타임에서 너무 힘들게됩니다. 이 방법은 운동으로 남아 가능합니다 무엇 모든

class Foo implements ArrayAccess { 
    private $bar; 

    public function offsetGet($name) { 
    switch($name) { 
     case "bar": 
     if(empty($this->bar)) $this->bar = new FooBar; 
     return $this->bar; 
    } 
    } 
    public function offsetExists($offset) { } 
    public function offsetSet($offset, $value) { } 
    public function offsetUnset($offset) { } 
} 

class FooBar implements ArrayAccess { 
    private $baz; 

    public function offsetGet($name) { 
    switch($name) { 
     case "baz": 
     if(empty($this->baz)) $this->baz = new FooBarBaz; 
     return $this->baz; 
    } 
    } 
    public function offsetExists($offset) { } 
    public function offsetSet($offset, $value) { } 
    public function offsetUnset($offset) { } 
} 

class FooBarBaz { 
    public function __toString() { 
    return "I'm FooBarBaz\n"; 
    } 
} 

$foo = new Foo; 
echo $foo['bar']['baz']; 

: 당신은 그것의 구조를 알고있는 경우

+3

아니요, 없습니다. 유스 케이스 나 컨텍스트에 대해보다 자세히 설명했다면 누군가가 더 나은 대안을 제시 할 수 있습니다. – mario

+0

특정 유스 케이스를 추가했습니다. –

+0

@ Mr.Manhattan 전역 변수 네임 스페이스 외부에서 100 %에 가까운 코드를 작성해야합니다. 그러면이 코드가 무엇을 제공할까요? – Marek

답변

1

그것은 $foo 다소 "마법"할 수도 있습니다.

+0

첫 번째 색인 만 필요하기 때문에 첫 번째 클래스는 이미 충분합니다. 이것은 내가 찾던 완벽한 접근법입니다. –