2009-07-18 2 views
76

첫 번째 질문은 SO이고 실제 RTM 후보입니다. 그러나 나는 당신을 보았고 그것을 찾을 수 없을 것이라고 약속합니다. 내가 놓친 간단한 것으로 밝혀지면 행복하게 #headpalm을 할 것이다.멤버 변수에 PHP 중괄호 구문

젠드 프레임 워크를 알아 내기 위해 노력하고 다음 구문을 가로 질러 온 :

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

나는 멤버 변수로 보이는 액세스하는 데 사용되는 중괄호 구문을 본 적이 없다. 나는 _SESSION는 관련이없는 것으로 가정하지만하지 않을 수 있기 때문에 질문을 포함하고있어이를 다른

$this->_session->user_id 

보다 얼마나.

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

TFM에 대한 모든 포인터가 있으므로 마음껏 감상 할 수 있습니다.

감사합니다. 부드럽게하십시오.

+7

감사합니다. 빠르고 우수합니다. 이렇게 부드럽게 시작하여 더 많이 사용하는 것이 좋습니다. 다행히도, 나는 물어 보지 않고 질문에 대답하는 것을 도울 수 있습니다. 건배. –

+1

흥미로운 tidbit : 중괄호로 메서드를 호출 할 수 있으며 결과는 메서드를 직접 호출하는 것만 큼 빠릅니다. call_user_func를 사용하는 것이 더 일반적이지만, $ obj -> {$ method} ("parm1,"parm2 "대신에 call_user_func (array ($ obj, $ method),"parm1 ","parm2 "); – Rolf

+0

그리고 후자는 더 읽기 쉽다. 적어도 IMO이다. 실제로, 나는 종종 메소드 이름에 중괄호를 생략한다 :'$ obj -> $ method ($ params)' –

답변

46

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

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 manual "복잡한 (구부러진) 구문"을 참조하십시오. variable variables를 사용하는 경우

+2

이것은 상황이 $ this -> _ session -> { 'user_id'} 사용 중입니다 – jimyi

+0

빠른 답장을 보내 주셔서 감사합니다 예, 제가 머리 글자를 쓰겠습니다. 다른 상황에서 구문을 사용했지만 인식하지 못했습니다. 그것은 구성원 변수의 컨텍스트에서입니다. 심지어 더 나쁜 것은, 내 검색에서 설명서의 해당 페이지에 있지만 멤버 변수 샘플을 보지 못했습니다. 한숨 ... 그래도 내가 준 예제는 실제로 사용하는 경우, 맞습니까? 실제 모호성은 없으며, 실제 묘사가 필요하지 않습니다. 구문 상 유효하지만, 불필요한 것들입니다. 나이. 무슨 뜻인지 알 겠어? –

+2

@jimyi, 나는 나의 대답을 더 분명히했다. 감사. @papayasoft, 귀하의 경우에는 불필요하다고 동의합니다. 내 생각 엔 자동 생성 코드이고 모든 기본을 커버하기 위해 복잡한 곱슬 구문을 사용한다는 것입니다. –

22

난 그냥 구문을 알고 : 귀하의 질문에

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

@jimyi가 암시하기 때문에 TFM에 대한 적절한 링크가있는 유일한 대답은 +1입니다. O.P.는 문자열의 복잡한 (곱슬) 구문에 관한 것이 아닙니다. 가변 변수에서 모호성을 해결하기 위해 중괄호를 사용하는 것입니다. –

9

두 예제는 같은 일을. PHP는

object->{'name_of_member'}; 

object->name_of_member; 

$member = 'name_of_member'; 
object->$member; 
19

Theres는 아마 하나의 큰는 일반적으로 털이 물건의 영역에서 그러나 그 구문의 활용, 그리고 당신은 아마 피하고 싶은 일 ... 당신은 여러 가지 방법으로 멤버 데이터/메소드에 액세스 할 수 있습니다.

다른 방법으로는 허용되지 않는 변수 이름에 문자를 사용할 수 있습니다.

예 : 당신이주는 예에서

$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에서는 \ 0을 ISTR 문자열 앞에 붙입니다 피벗 변수에 액세스 할 수 있습니다. 적어도 \ 0은 "미안하다"치명적인 예외를줍니다. –

+5

절대적으로 끔찍한 악몽을 불러 일으키는 변수 이름은 +1. 나는 어쨌든 자려고하지 않았습니다 ... –

11

은, 실제 차이가 없다, 그것은 명확 때문에 IMO $this->_session->user_id 사용해야합니다.

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