본문 바로가기

개발/php

static 배열 요소 참조

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 때문에 한 페이지에서 생성한 객체가 다른 페이지로 넘어가지 않는다. 그래서 페이지마다 필요한 객체를 새로 생성해야 하지만 적어도 한 페이지 안에서는 객체를 중복하여 생성하지 않아도 된다.


반응형