Reference to element of static array
레퍼런스를 리턴하는 함수에서 static 배열요소를 리턴하였을 때,
리턴값을 받은 변수는 static 배열의 요소를 참조하는가?
아니면 static 배열을 참조하여 해당 요소를 복사한 값을 가지는가?
function &func_elm($k, $v) { static $hold = array('alpha'=>0, 'bravo'=>9); if (array_key_exists($k, $hold)) { $hold[$k] += $v; } else { $hold[$k] = 0; } return $hold[$k]; } $omega =& func_elm('omega', 1); print_dump($omega); // 0 func_elm('alpha', 2); func_elm('omega', 2); func_elm('alpha', 2); func_elm('omega', 3); print_dump($omega); // 5
레퍼런스 리턴 함수에서 static 배열의 요소를 리턴하면, 결과를 받은 변수는 배열 요소를 값으로 가지는게 아니라 배열 요소를 가리킨다. 그러므로 직접 변수값을 조작하지 않고 함수를 호출하는 것만으로 변수를 통해 얻을 수 있는 값을 변경할 수 있다. 즉, 변수를 호출하면 변수의 값이 아닌, 변수가 가리키는 곳에 있는 값을 돌려준다.
같은 원리로 객체를 처음 사용할 때 static 배열에 추가해 놓으면 필요할 때마다 static 배열에서 꺼내어 사용할 수 있으므로 같은 객체의 중복 생성을 피할 수 있다.
웹의 특성상 Data Access Object(DAO)를 많이 사용한다. 자칫 한 페이지 안에 같은 DAO를 많이 만들어 수 있다. 레퍼런스 리턴 함수의 static 변수/배열을 사용하면, 이처럼 여러 객체에서 DAO를 필요로 할 때, 만들어 놓은 DAO를 참조하여 사용할 수 있다.
웹의 또다른 특성인 stateless 때문에 한 페이지에서 생성한 객체가 다른 페이지로 넘어가지 않는다. 그래서 페이지마다 필요한 객체를 새로 생성해야 하지만 적어도 한 페이지 안에서는 객체를 중복하여 생성하지 않아도 된다.
반응형