2014-04-03 4 views
3

PHP에서 가변 변수의 개념을 이해합니다. 변수 변수 PHP에서 다음 코드에 대한 이해에 따르면PHP 가변 객체 속성

$foo = 'hello'; 
$$foo = 'world'; 

echo $foo . ' ' . $hello; 

이 같은 출력 생성합니다

Hello World 

을하지만 어려운 변수 객체의 경우를 이해하는 것이 발견하고 속성

다음과 같이 단일 속성으로 foo라는 클래스가 있습니다.

이제
class foo {  
    var $r = 'I am r.'; 
} 

, 클래스 foo는 인스턴스를 생성하고 변수 변수 다음 코드의 개념을 사용하여 :

모든 것이 벌금
I am r. 

입니다까지 :

$foo = new foo(); 

$bar = 'r'; 
echo $foo->$bar; 

가 출력 ,하지만 배열 값을 가진 속성을 포함 시키면 엉망이되어 버립니다. 말은 예를 들어 나는 클래스 foo는에 배열 값과 다른 속성을 추가하고 이제 클래스는 다음과 같습니다 나는 클래스 foo는의 인스턴스를 생성하고 속성을 읽으려고하면 이제

class foo {  
    var $arr = array('I am A.', 'I am B.', 'I am C.'); 
    var $r = 'I am r.'; 
} 

$arr = 'arr'; 
echo $foo->$arr[1]; 

출력한다 : 다음 $ [1]을, 언

I am r. 

그리고 출력이 이상하게 보입니다. 어떻게 의미합니까 $ foo -> $ arr [1]은 foo 클래스의 $ r로 해결됩니까?

는 $ foo는 일을 안 -> $ 편곡 해결 $ foo->편곡에 [1] (이 : 더 달러 기호가 없습니다) 출력 제공 :

I am B. 

어떻게 이것이 일어날까요?

나는 $ foor {$ arr} [1] 출력이 인 것을 알고 있습니다. "나는 B 다."

제 질문은 왜 $ foo -> $ arr이 $ foo-> arr을 해결하지 못합니까? 변수 $ arr이 'arr'값을 보유하고 있다고 가정하면?

관리자/수퍼바이저에게 보내는 메모 :이 질문은 중복되지 않습니다. 비슷한 질문을 검색해 보았지만 아무 것도 알아야 할 대답이 없었습니다.

답변

7
class foo {  
    var $arr = array('I am A.', 'I am B.', 'I am C.'); 
    var $r = 'I am r.'; 
} 

$foo = new foo; 
$arr = 'arr'; 
echo $foo->$arr[1]; 

여기에서 물어 보는 것이 우선 순위입니다. 문자열 배열은 인덱스 0, 내가 R 오전 '문자열을 인쇄에'도착 ', 즉'R ', 그리고 결과에 $arr[1] 참조 두 번째 문자로 시작되기 때문에 마지막 줄은

echo $foo->{$arr[1]}; 

로 다시 작성할 수 있습니다 . '

기대하고있는 결과를 얻으려면, 기본적으로 탐욕스럽게 거의 모든 것을 취하기 때문에 표현식의 어느 부분이 변수 이름을 의미하는지 명시 적으로 PHP에 알려야합니다. 이것으로 마지막 줄을 교체하는 출력을 얻을 것이다 당신이 예상 :

echo $foo->{$arr}[1]; 

이이 전체 문자열 '편곡', 다음 사용에 $arr을 평가하는 것이다 foo에서 클래스 멤버 $arr에 레이블로; 인덱스는 배열의 두 번째 항목 인 '나는 B입니다.'를 가져옵니다.

+1

단지 같은 것을 게시하고 싶습니다. - http://ideone.com/7s8stM –

+0

@KarolyHorvath. 여기 내 완전한 대답의 개념 증명이 있습니다 : http://ideone.com/VGmLP8 – Kromey

+0

중괄호를 사용하여 제공 한 솔루션에 대해 알고 있고 이미 제 질문에서도 언급했습니다. 그리고 당신의 답은 제 시간을 많이 절약 해주었습니다. 고맙습니다. 답변을 수락하려고 시도했지만 스택 오버플로는 4 분 내에 응답을 수락 할 수 없다고 말합니다. 다시 한 번 고맙다. – mystic