원하는 사이트에 코드를 삽입하는 템플릿 엔진을 사용하고 있습니다.
저는 꽤 쉬운 것을 테스트하는 함수를 썼습니다.
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
문제는 $this->데이터는 개인 데이터이기 때문에 어디서든 액세스할 수 없기 때문에 getData()를 사용해야 한다는 것입니다.
$this->getData()['a']['b']
if() 블록에서 직접 사용되기 때문에 값을 먼저 할당해도 동작하지 않습니다.
좋은 생각 있어요?
질문에 대한 답변
PHP 5.4에서는 다음과 같은 작업이 가능합니다.
getSomeArray()[2]
참고 자료: https://secure.php.net/manual/en/language.types.array.php#example-62
PHP 5.3 이전 버전에서는 임시 변수를 사용해야 합니다.
다음과 같은 것은 사용할 수 없습니다.
$this->getData()['a']['b']
즉, 함수 호출에서는 어레이 액세스 구문을 직접 사용할 수 없습니다.
다음과 같은 임시 변수를 사용해야 합니다.
$tmp = $this->getData(); $tmp['a']['b']
// use $tmp, now
당신의 경우, 이것은 아마도 다음과 같은 것을 사용한다는 것을 의미합니다.
function myfunction() {
$tmp = $this->getData();
return ($tmp['a']['b'] ? true : false); }
다음 작업을 수행해야 합니다.
- 먼저, 당신의
getData()
method 및 그 반환값을 임시 변동에 저장합니다. - 그런 다음 해당 임시 변수를 테스트에 사용합니다.
그건 선택의 여지가 없어, 사실…
좋아… 더 좋은 방법은 없는 것 같아. 그래서 난 별로 아름다운 해결책으로 내 자신에게 대답할 거야.
다음 함수를 만들었습니다.
arrayGet($array, $index) { return $array[$index]; }
그리고 이렇게 썼어요.
myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }
이것은 예쁘지는 않지만 효과가 있다.
$this
->data
가 보호되고 있는 경우는, 항상 액세스 할 수 있습니다.$object
->data
모든 곳에서 접근할 수 있는 것은 아니기 때문에, 만약 당신이 돌아오고 싶다면$this
그렇게 평가되면 괜찮을 겁니다.
그런데 당신의 코드에 버그가 있습니다.인용문은 생략해야 합니다.
myfunction() { return '($this->data['a']['b'] ? true : false)'; }
PHP 버전 5.4부터 가능합니다.
임시 변수를 원하지 않고 PHP 버전이 5.4보다 작다면, 여전히 몇 개의 내장 함수를 사용하여 처음 또는 마지막 요소를 가져올 수 있습니다.
$x
= 'first?last'; $first = array_shift(explode('?', $x)); $last
= end(explode('?', $x)); $last2 = array_pop(explode('?', $x));
편집:!!!이후 버전(5.4+)에서는 PHP가 알림을 보냅니다.이는 end가 변수만 파라미터로 예상하기 때문입니다.