2010-01-11 1 views
1

나는 울기 시작할 준비가되었습니다. 필자는 php.net 매뉴얼 페이지를 읽고, 다양한 구문으로 12 건의 Google 검색을 시도했으며, 수백 개의 stackoverflow 스레드를 스캔했습니다. 나는이 방법을 사용하는 것을 보았지만, 그것은 단지 나를 위해 작동하지 않는다. 그것은 매우 기본적인 것처럼 보입니다. 몇 가지 관련 질문이나 문제가있어 답변을 찾는 방법을 모릅니다.eval()을 사용하여 기본 PHP 템플릿에 오류가 발생했습니다.

PHP 파일의 중요한 부분은 다음과 같습니다

<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>
내가 얼마나 깔끔한 좋아하고 코드가 청소 :

switch() { 
…other cases… 
default: 
    $tpl['title'] = "Newsletter Signup"; 
    $tpl['description'] = "Newsletter description"; 
    $tpl['page-content'] = file_get_contents('signup.html'); 
} 

$tpl_src = addslashes(file_get_contents('index.tpl')); 
eval("\$html = \"$tpl_src\";"); 
echo $html; 

내 한편, index.tpl 파일을 다음과 같은 라인을 포함 , 여분의 무리없이 여분 <?=…?> 's.

먼저 중괄호 {}를 문자열에 표시하면 무엇이라고할까요? 내가 그것을 볼 수 있고 내가 아는 한 그들을 사용하는 법을 배울 수 있을지도 모른다.

다음은 전혀 작동하지 않습니다. 변수 키에서 작은 따옴표를 제거하면 좋지만 php.net은 내 이름이 어느 시점에서 언어 상수가되는 경우를 대비해서는 안된다고 말합니다. 공정하다. 하지만 어떻게 해결할 수 있습니까? evalTemplate 서브 루틴을 빌드하고 $ tpl을 전달할 수 있기 때문에 vars에 배열을 사용하는 것을 좋아합니다.

마지막으로, $ tpl [ 'page-content']가 출력되지 않습니다. 변수는 괜찮습니다. echo $tpl['page-content']을 사용하여 테스트 할 수 있지만 최종 HTML에는 빈 줄 하나가 표시됩니다.

내가 아직 모르는 언어의 일부면이있을 것입니다. 어떤 도움을 많이 주시면 감사하겠습니다 !!

+0

'eval ("\ $ html = \"$ tpl_src \ ";");'. 단지'eval'과 모든 복잡한 인용과 이스케이프를 생략해야합니다.이렇게하라 :'$ html = $ tpl_src;'정확히 같은 것을 평가한다. – Asaph

+1

@Asaph - 'eval'이로드 된 문자열의 보간을 강제하는 데 필요하므로 작동하지 않습니다. –

+1

@K 프라임; 오, 알았어. Meh. 나는 'eval'의 이런 사용 (그리고 대부분의 사용법)이 스타일 적으로 매력적이지 않다는 것을 알았습니다. ... – Asaph

답변

0

Volker가 지적했듯이 addslashes이 문제가되는 것 같습니다. 대신 addcslashes을 시도하십시오. 또한, 나는 강력하게이 sanitisation을 단순화하기 위해, 함수 만드는 것을 권 해드립니다/분석 :

function render ($file, $vars) 
{ 
    // .. extra sanitisation, validation, et al. 
    $_html = ''; 
    $_raw_file = addcslashes (file_get_contents ($file), '"\\'); 
    extract ($vars, EXTR_SKIP); 
    eval ('$_html = "'.$_raw_file.'"'); 

    return $_html; 
} 

그리고 이렇게 전화 :

switch() { 
// …other cases… 
default: 
    $tpl['title'] = "Newsletter Signup"; 
    $tpl['description'] = "Newsletter description"; 
    $tpl['page-content'] = render ('signup.html'); 
} 

echo render ('index.tpl', $tpl); 

PS : extract의 사용은 위의 바르가 간단하게된다는 것을 의미합니다 $title이 아닌 $tpl['title']

+0

나는 각 문제를 완벽하게 해결하고 내 어휘에 '추출'과 'addcslashes'를 추가하기 때문에이 대답을 좋아합니다! 무리 감사! –

0

일반적으로 문자열 변수 확장에 ''문자열 구분 기호를 사용하지 않습니다. 나는. "$tpl['content']" 대신 "$tpl[content]"입니다.

중괄호는 식별자 문자가 이름 앞이나 뒤에 올 때 변수의 범위를 구분합니다. 예 :

$item = "Cup"; 
$text = "I smashed four $items"; // won't work 
$text = "I smashed four {$item}s"; // will work. 

// 2nd output: "I smashed four Cups" 
+1

중괄호 정보에 대해 너무 고마워요! 그것은 총체적으로 의미가 있으며, 이제는 그런 방식으로 사용되는 것을 봅니다. –

0

addslashes()는 문자열 내에서 작은 따옴표와 큰 따옴표 모두 앞에 슬래시를 추가합니다. 귀하의 예를 들어 생성 된 코드는

$html = "<title>{$tpl[\'title\']}</title> 
<meta name=\"description\" content=\"{$tpl[\'description\']}\" /> 
nav, etc…¦ 
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>"; 

수 그리고 것 {$ TPL [\ ' \ 제목 ']} 잘 분석하지 않습니다.

관련 문제