2012-01-29 3 views
14

OpenCart 소스를 읽었을 때 아래 표현식을 사용했습니다. 누군가가 나에게 그것을 설명 할 수 없습니다 : 문에서PHP의 곱슬 곱슬 표기법

$quote = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address); 

{}을 가지고
$this->{'model_shipping_' . $result['code']}
하는 이상한 코드 부분이 나는 그게 뭔지 궁금해? 그것은 나에게 물건을 닮았다. 그러나 나는 정말로 모른다.

답변

23

중괄호가 PHP에서 문자열이나 변수 보간을 표시하는 데 사용됩니다

그렇지 않으면 다음과 같은 구별 할 방법이 없습니다. 그것은 당신이 실제로 무엇을 명시 적으로 알지 못해도 함수를 호출 할 수있게 해주는 '가변 함수'를 만들 수있게합니다. 이 사용

, 당신은 거의 당신 같은 객체에 속성을 만들 수있는 것 배열 :

$property_name = 'foo'; 
$object->{$property_name} = 'bar'; 
// same as $object->foo = 'bar'; 

아니면 REST API를 클래스의 일종이있는 경우, 메소드 세트 중 하나를 호출 할 수 있습니다 :

$allowed_methods = ('get', 'post', 'put', 'delete'); 
$method = strtolower($_SERVER['REQUEST_METHOD']); // eg, 'POST' 

if (in_array($method, $allowed_methods)) { 
    return $this->{$method}(); 
    // return $this->post(); 
} 

당신이 원하는 경우도보다 쉽게 ​​보간을 식별하는 문자열에 사용되는에 :

$hello = 'Hello'; 
$result = "{$hello} world"; 

물론 이것들은 단순화 된 것입니다. 예제 코드의 목적은 $result['code'] 값에 따라 여러 함수 중 하나를 실행하는 것입니다.

+1

감사합니다. 나는이 설명을 매우 이해하기 쉽고 광범위하게 발견했습니다. – Tarik

+1

첫 번째 예제에서'$ object-> $ property_name = 'bar''라고 쓰면 똑같은 효과가 나타납니다. 중괄호가 사소한 표현 일 때만 필요하다고 가정합니다. – Cruncher

4
+3

베어 링크 응답은 답변이 아닙니다. 이 질문이 다른 질문과 중복된다고 생각하면 종결을 위해 신고하십시오. 그렇지 않으면, 당신은 당신이 인용하는 링크에 대해 자세히 설명해야합니다. – BoltClock

+0

문자열의 중괄호를 알고 있지만 중괄호는 예제에서 인용 부호로 묶이지 않았습니다. – Tarik

+0

@ BoltClock 감사합니다. – Kristian

10

속성의 이름은 액세스 특성이 될 것이다 $result['code']'abc'이고, 두 문자열

세이에서 런타임시 계산

$this->model_shipping_abc 

이 속성이나 메서드 이름에 이상한 문자가있는 경우에도 유용합니다.

class A { 
    public $f = 'f'; 
    public $func = 'uiae'; 
} 

$a = new A(); 
echo $a->f . 'unc'; // "func" 
echo $a->{'f' . 'unc'}; // "uiae" 
+0

아무도 아무 말도 안했어? 서있는 코드는 전혀 작동하지 않습니다 (함수 호출 누락). 함수 대신 vars를 사용하여 수정되었습니다. – knittl

관련 문제