멤버 변수에 대한 PHP 중괄호 구문


79

SO에 대한 첫 번째 질문이며 실제 RTM 후보입니다. 그러나 나는 내가 보았고 그것을 찾을 수없는 것처럼 당신에게 약속합니다. 내가 놓친 단순한 일로 밝혀지면 행복하게 #headpalm을 할 것입니다.

Zend Framework를 알아 내려고 시도하고 다음 구문을 발견했습니다.

$this->_session->{'user_id'}

멤버 변수로 보이는 항목에 액세스하는 데 사용되는 중괄호 구문을 본 적이 없습니다. 어떻게 다른가요?

$this->_session->user_id

나는 _session이 관련이 없다고 가정하고 있지만 그렇지 않을 수 있으므로 질문에 포함시킵니다.

중괄호는 복합 변수 이름 user_id를 래핑하려고 시도하는 정리 규칙입니까? 아니면 특별한 접근 자인가?

내가 R을 할 수 있도록 TFM에 대한 모든 포인터는 겸손하게 감사하겠습니다.

감사합니다. 부드러워주세요.


7
빠르고 훌륭한 답변에 감사드립니다. 이렇게 부드럽게 시작하면서 더 많이 사용하는 것이 좋습니다. 질문 만하는 것이 아니라 질문에 답할 수 있기를 바랍니다. 건배.
David Weinraub

1
흥미로운 정보 : 곱슬 구문으로 메서드를 호출 할 수 있으며 결과는 메서드를 직접 호출하는 것만 큼 빠릅니다. call_user_func를 사용하는 것이 더 일반적이지만 $ obj-> {$ method} ( "parm1,"parm2 "대신 call_user_func (array ($ obj, $ method),"parm1 ","parm2 ")를 수행하는 데 2 ​​배가 걸립니다. );
Rolf

그리고 후자도 더 읽기 쉽습니다. 적어도 IMO. 사실, 나는 종종이 경우 메소드 이름에 괄호를 생략 :$obj->$method($params)
데이비드 Weinraub

답변:


51

중괄호는 변수 이름의 끝을 명시 적으로 지정하는 데 사용됩니다. 예를 들면 :

echo "This square is {$square->width}00 centimeters broad."; 

따라서 귀하의 사례는 실제로 두 가지 특수 사례의 조합입니다. 중괄호 등을 사용하여 클래스 변수에 액세스 할 수 있습니다.

$class->{'variable_name'} // Same as $class->variable_name
$class->{'variable' . '_name'} // Dynamic values are also allowed

그리고 귀하의 경우에는 중괄호 구문으로 둘러싸고 있습니다.

PHP 매뉴얼 "복잡한 (곱슬) 구문"을 참조하십시오 .


2
이것은 $ this-> _ session-> { 'user_id'}가 사용되는 상황이 아닙니다.
jimyi

빠른 답변 감사합니다. 그래, 내가 헤드 팜을 가져갈 게. 다른 상황에서 구문을 사용했지만 멤버 변수의 컨텍스트에서 인식하지 못했습니다. 더 나쁜 것은 내 검색에서 매뉴얼의 해당 페이지에 있었지만 멤버 변수 샘플을 보지 못했습니다. 한숨 ... 그래도 내가 준 예는 그것을 사용하는 일종의 이상한 경우였습니다. 실제 모호함이 없으며 실제 묘사가 필요하지 않습니다. 확실히 구문 상 유효하지만 불필요한 사용입니다. 무슨 말인지 알 겠어요?
David Weinraub

2
@jimyi, 나는 내 대답을 더 명확히했다. 감사. @papayasoft, 귀하의 경우에는 불필요하다는 데 동의합니다. 내 생각 엔 자동 생성 코드이며 모든 기반을 덮기 위해 복잡한 곱슬 구문을 사용합니다.
James Skidmore

24

변수 변수를 사용할 때 구문을 알고 있습니다 .

$userProp = 'id';
$this->_session->{'user_'.$userProp};

1
@jimyi가 암시 한 것처럼 TFM에 대한 적절한 링크가있는 유일한 답변에 +1하십시오. OP는 문자열에 대한 복잡한 (곱슬) 구문이 아닙니다. 변수 변수의 모호성을 해결하기 위해 중괄호를 사용하는 방법입니다.
Bob Stein

19

이 구문의 큰 장점은 일반적으로 털이 많은 영역에 있으며 아마도 피하고 싶은 것입니다.

그렇지 않으면 허용되지 않는 변수 이름에 문자를 사용할 수 있습니다.

즉 :

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 

6
그러나 귀하의 예만큼 극단적 일 필요는 없습니다. 예를 들어, 세션 데이터가 데이터베이스에 저장되고 "user_id"대신 "user-id"라는 열이 있다고 상상할 수 있습니다.
mercator

2
또한 이전 버전의 PHP에서는 문자열 ISTR 앞에 \ 0을 입력하여 pivate 변수에 액세스 할 수 있습니다. 이제 적어도 \ 0은 "당신은 그렇게 죄송합니다"라는 치명적인 예외를 제공합니다.
Kent Fredric

12

귀하가 제공하는 예에서는 실제 차이가 없으며 IMO $this->_session->user_id가 더 명확하기 때문에 사용해야합니다.

중괄호 구문이 실제로 유용한 것은 이름에 대한 표현식을 구성하여 멤버 변수에 액세스하는 것 $this->_session->{'user_id' . $index}입니다.


11

귀하의 질문에있는 두 가지 예는 동일한 작업을 수행합니다. PHP를 사용하면 여러 가지 방법으로 멤버 데이터 / 메소드에 액세스 할 수 있습니다.

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.