2011-06-13 2 views
17

the manual ("문자열 액세스 및 수정 문자"섹션 바로 앞에있는 비트)을 읽는 것은 클래스 상수와 {} 문자열을 사용하여 멋진 트릭을 만들 수 있지만 이 메서드가 진리를 반환하게하는 간단한 작업을 수행 할 수 없습니다.PHP의 문자열에있는 클래스 상수

class c { 
    const k = '12'; 
    public function s() { 
     return "Twelve in decimal is {c::k}."; 
    } 
} 

여기에 올바른 솔루션을 연결 하시겠습니까?

+0

연결이 작동하기 때문에 왜 연결하지 않았습니까? – tplaner

+7

@evolve : 질문은 PHP 코드에 관한 것이지 좋은 코드의 구성 요소에 관한 것이 아닙니다. 내가 선택의 여지가 있다면 왜 연결시키지 않을 것인가? –

+0

당신이 왜 연결하고 싶지 않은지 궁금해하는 사람이 있다면; 따옴표로 묶은 문자열보다는 _heredoc_ 문자열을 사용할 수도 있습니다. 두 변수 모두 변수를 확장하지만 heredoc은 실제로 연결을 잘 수행하지 않습니다. –

답변

9

여기에 올바른 솔루션을 연결 하시겠습니까?

예. 확장 된 곱슬 구문은이를 지원하지 않습니다.

또는 상수 목록을 배열로 내 보낸 다음이를 사용하거나 단일 스칼라 변수 이름으로 상수를 내보낼 수도 있습니다.하지만 실제로는 좋은 해결책이 아닙니다. 이 작업을 수행 할 수있는 정수를 사용할 수 있습니다

참고 :

const k = 'foo'; 
$foo = 'bar'; 
echo "{${c::k}}" 

당신에게 bar을 제공하지만, 당신이 원하는 아니다.

7

약간은 알 수 없지만이 설명서에는이 메모가 있습니다.

{$} 내부의 함수, 메소드 호출, 정적 클래스 변수 및 클래스 상수는 PHP 5부터 작동합니다. 그러나 액세스되는 값은 문자열이 정의 된 범위의 변수 이름으로 해석됩니다 . 단일 중괄호 ({})를 사용하면 함수 또는 메서드의 반환 값이나 클래스 상수 또는 정적 클래스 변수 값에 액세스 할 수 없습니다.

마지막 문장은 이렇게 예, 연결 여기 갈 수있는 방법이 작동하지 않습니다 알려줍니다. 상기 단락


(변형) 예 :

<?php 
class beers { 
    const softdrink = 'rootbeer'; 
} 

$rootbeer = 'A & W'; 

// This works; outputs: I'd like an A & W 
echo "I'd like an {${beers::softdrink}}\n"; 

// This won't work; outputs: I'd like an {beers::softdrink} 
echo "I'd like an {beers::softdrink}\n"; 
+0

그건 정확히 제가 OP에서 언급 한 부분의 부분이고 저를 조금 혼란스럽게 만들었습니다. 그러나 우리는 이것이 의미하는 바에 동의한다고 생각합니다. –

5

곱슬 구문은 "가변 식 '작동. 그리고 당신은 당신이 접근 할 수있는 무엇이든을 {$과 함께 필요로합니다.

$c = "constant"; 
    return "Twelve in decimal is {$c('c::k')}."; 

분명하지 훨씬 짧거나 그냥 여기 문자열 연결을 사용하는 것보다 더 읽을 수 :

오, 해당 해결 방법이있다.

관련 문제