2012-12-07 6 views
1

필자는 PHP를 내 뷰 레이어의 템플릿 언어로 사용하고 있습니다. 다음을 약간 더 명확하고 간결하게 만들 수 있습니까?PHP 템플릿의 정의되지 않은 변수

//in temp.phtlm 
<?= (isset($user['name'])) ? $user['name'] : null; ?> 

불행하게도 우리는 심지어 그것을 위해 함수를 정의 할 수 없습니다 :

// as you know yet a notice is generated when calling function with undefined parameter 
function out($var) 
{ 
     return (isset($var)) ? htmlentities($var) : null; 
} 

답변

1

사용 @ 연산자는 가장 쉬운 대안입니다.

<?= @$user['name']; ?> 
+0

PHP에서'@'를 사용하는 것은 나쁜 습관입니다. 나는이 길로 가지 않을 것을 희망한다. 그리고 그것은 대안이 아닙니다. 어떻게'$ user [ 'name']'에 메소드를 적용 할 수 있습니까? '@htmlentities (@ user [ 'name'])'또는'@htmlentities ($ user [ 'name'])'또는'@htmlentities (@ $ user [ 'name'])'? '@'를 피하는 간단한 규칙은 항상 변수를 템플릿에 전달하는 것입니다. 나는이 솔루션이 매우 짧다고 생각하지만 때로는 그러한 해킹을 피하기 위해 데이터를 준비해야 할 때도있다. ('@'는'PHP'에서 해킹으로 간주되어야한다). 그냥 예방책이야. – Nemoden

+0

@Nemoden'(isset ($ user [ 'name'])))에 대한 최선의 해결책은 무엇입니까? $ user [ 'name'] : null;'은 템플릿에 있습니다. 당신은 고지를 숨기는 대신 그것을 사용할 수 있습니다. 'htmlentities (@ $ user [ 'name']) 또는 @htmlentities ($ user [ 'name']) 또는 @htmlentities (@ $ user [ 'name'])'는 완전히 괜찮습니다. '@'는 상황에 가장 잘 들어 맞습니다. – PHPst

+0

그것은 최선의 해결책은 아닙니다. http://php.net/manual/en/language.operators.errorcontrol.php를 읽으십시오 : "@를 쓰는 것은 dog-slow입니다. PHP는 이런 식으로 에러를 억제하기 위해 오버 헤드를 발생 시키므로 속도와 트레이드 오프 사이의 트레이드 오프입니다. 편리함. " 그리고 행동에있어서 dog-slow입니다. - 코드에서 각'@ '를 처리하기 위해'isset'에 2ms 가량 더 걸립니다 (테스트에서 생각한 것까지). 오류 억제 기능은 절대로 "최상의 솔루션"이 아닙니다. 오류 (심지어 고지 사항)를 정상적으로 처리하는 대신 눈을 감 으십시오. – Nemoden

2

는 아니, 더 빨리 할 수있는 더 짧은 손 방법이 없습니다. $ var가 그 지점에 존재하지 않으면 다른 메소드는 오류를 발생시킵니다.

구조체/템플릿 시스템에 따라 클래스를 사용하여 var를 저장하고 __get, __set, __isset, __unset 등의 마법 메서드를 사용하여 변수를 호출 할 수 있습니다. 그 메소드는 var가 존재하지 않으면 null을 반환 할 수 있습니다. 그래도 코드를 변경해야합니다. 당신은 여기에 마술 방법에 대한 설명서를 찾을 수 있습니다 원래 코드로 http://php.net/manual/en/language.oop5.magic.php

을, 나는이처럼 작성합니다

<?php echo (isset($var) ? $var : null); ?> 
+0

감사합니다. 정의되지 않은 배열 요소에도 적용 할 수 있습니까? – PHPst

+0

아니요, 일반적으로 배열 인덱스에 대해 isset을 사용해야합니다. –

2
//in temp.phtlm 
<?=$var?> 

//in whatever_your_script_name.php 
$template->var = isset($var) ? htmlentities(whatever(convert(encode($var)))) : ''; 
$template->render('temp.phtml');