문제

PHP에서 HEREDOC 문자열 선언은 HTML 블록을 출력하는 데 정말 유용합니다.변수 앞에 $를 붙이기만 하면 변수를 구문 분석할 수 있지만 더 복잡한 구문(예: $var[2][3])의 경우 표현식을 {} 중괄호 안에 넣어야 합니다.

PHP 5에서는 ~이다 HEREDOC 문자열 내의 {} 중괄호 내에서 실제로 함수 호출을 수행할 수 있지만 약간의 작업을 수행해야 합니다.함수 이름 자체는 변수에 저장되어야 하며 동적으로 이름이 지정된 함수처럼 호출해야 합니다.예를 들어:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;

보시다시피 이것은 다음보다 조금 더 지저분합니다.

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;

첫 번째 코드 예제 외에도 HEREDOC에서 벗어나 함수를 호출하거나 문제를 되돌리고 다음과 같은 작업을 수행하는 등의 다른 방법이 있습니다.

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>

후자는 출력 버퍼링을 사용하지 않는 한 출력이 출력 스트림에 직접 입력된다는 단점이 있는데, 이는 내가 원하는 것이 아닐 수도 있습니다.

그래서 내 질문의 본질은 다음과 같습니다.이것에 접근하는 더 우아한 방법이 있습니까?

응답을 기반으로 편집: 확실히 어떤 종류의 템플릿 엔진이 내 삶을 훨씬 더 쉽게 만들어 줄 것 같지만 기본적으로 내 평소 PHP 스타일을 뒤집어야 합니다.그게 나쁜 건 아니지만 내 관성을 설명해주는군..하지만 저는 삶을 더 쉽게 만드는 방법을 찾고 있어서 지금 템플릿을 조사하고 있습니다.

도움이 되었습니까?

해결책

개인적으로는 HEREDOC을 전혀 사용하지 않을 것입니다.그것은 단지 좋은 "템플릿 구축" 시스템을 만드는 것이 아닙니다.모든 HTML은 몇 가지 단점이 있는 문자열로 잠겨 있습니다.

  • WYSIWYG 옵션 없음
  • IDE에서 HTML에 대한 코드 완성이 없습니다.
  • 논리 파일에 잠긴 출력(HTML)
  • 결국 루핑과 같은 더 복잡한 템플릿을 얻기 위해 지금 하려는 것과 같은 해킹을 사용해야 합니다.

기본 템플릿 엔진을 사용하거나 포함된 PHP를 사용하세요. 이것이 바로 언어에 다음과 같은 기능이 있는 이유입니다. <?php 그리고 ?> 구분 기호.

template_file.php

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

index.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');

다른 팁

정말로 이 작업을 수행하고 싶지만 클래스를 사용하는 것보다 조금 더 간단하다면 다음을 사용할 수 있습니다.

function fn($data) {
  return $data;
}
$fn = 'fn';

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;

나는 다음을 수행할 것입니다:

$string = <<< heredoc
plain text and now a function: %s
heredoc;
$string = sprintf($string, testfunction());

이것이 더 우아하다고 생각할지 확실하지 않습니다 ...

다음을 시도해 보십시오(전역 변수로 사용하거나 필요할 때 인스턴스화).

<?php
  class Fn {
    public function __call($name, $args) {
      if (function_exists($name)) {
        return call_user_func_array($name, $args);
      }
    }
  }

  $fn = new Fn();
?>

이제 모든 함수 호출은 $fn 사례.그래서 기존 함수는 testfunction() heredoc에서 다음과 같이 호출할 수 있습니다. {$fn->testfunction()}

기본적으로 우리는 모든 함수를 클래스 인스턴스로 래핑하고 PHP의 __call magic 클래스 메서드를 호출해야 하는 실제 함수에 매핑하는 메서드입니다.

좀 늦었지만 우연히 보게 됐네요.미래의 독자들을 위해 제가 할 일은 다음과 같습니다.

나는 단지 출력 버퍼를 사용할 것이다.따라서 기본적으로 ob_start()를 사용하여 버퍼링을 시작한 다음 함수, 변수 등이 포함된 "템플릿 파일"을 포함합니다.그 안에서 버퍼의 내용을 가져와 문자열에 쓴 다음 버퍼를 닫습니다.그런 다음 필요한 변수를 사용하고, 모든 기능을 실행할 수 있으며, IDE에서 여전히 HTML 구문 강조 표시를 사용할 수 있습니다.

내가 의미하는 바는 다음과 같습니다.

템플릿 파일:

<?php echo "plain text and now a function: " . testfunction(); ?>

스크립트:

<?php
ob_start();
include "template_file.php";
$output_string = ob_get_contents();
ob_end_clean();
echo $output_string;
?>

따라서 스크립트는 버퍼에 template_file.php를 포함하고 모든 함수/메소드를 실행하고 그 과정에서 모든 변수를 할당합니다.그런 다음 버퍼의 내용을 변수에 기록하고 원하는 작업을 수행하면 됩니다.

그렇게 하면 그 순간에 페이지에 내용을 표시하고 싶지 않다면 그럴 필요가 없습니다.출력하기 전에 문자열을 반복하고 계속 추가할 수 있습니다.

템플릿 엔진을 사용하고 싶지 않다면 이것이 가장 좋은 방법이라고 생각합니다.

완전성을 위해 다음을 사용할 수도 있습니다. !${''} 마법 파서 해킹:

echo <<<EOT
One month ago was ${!${''} = date('Y-m-d H:i:s', strtotime('-1 month'))}.
EOT;

이 조각은 사용자 범위 내에서 정의된 함수의 이름으로 변수를 정의하고 이를 동일한 이름이 포함된 문자열에 바인딩합니다.시연해 보겠습니다.

function add ($int) { return $int + 1; }
$f=get_defined_functions();foreach($f[user]as$v){$$v=$v;}

$string = <<< heredoc
plain text and now a function: {$add(1)}
heredoc;

이제 작동합니다.

나는 heredoc을 사용하는 것이 HTML 코드를 생성하는 데 좋다고 생각합니다.예를 들어, 다음 내용은 거의 완전히 읽을 수 없습니다.

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

그러나 단순성을 달성하려면 시작하기 전에 기능을 평가해야 합니다.나는 이것이 그렇게 끔찍한 제약이라고 생각하지 않습니다. 왜냐하면 그렇게 하면 결국 계산과 디스플레이가 분리되기 때문입니다. 이는 일반적으로 좋은 생각입니다.

나는 다음이 꽤 읽기 쉽다고 생각합니다.

$page_content = getPageContent();

print <<<END
<html>
<head>
  <title>$page_title</title>
</head>
<body>
$page_content
</body>
END;

불행히도 귀하의 질문에서 함수를 변수에 바인딩하는 것이 좋은 제안이었음에도 불구하고 결국에는 코드에 복잡성 수준이 추가되어 가치가 없으며 코드 읽기가 어려워집니다. heredoc의 가장 큰 장점.

여기에서 래핑 기능을 사용하여 좋은 솔루션을 찾았습니다. http://blog.nazdrave.net/?p=626

function heredoc($param) {
    // just return whatever has been passed to us
    return $param;
}

$heredoc = 'heredoc';

$string = <<<HEREDOC
\$heredoc is now a generic function that can be used in all sorts of ways:
Output the result of a function: {$heredoc(date('r'))}
Output the value of a constant: {$heredoc(__FILE__)}
Static methods work just as well: {$heredoc(MyClass::getSomething())}
2 + 2 equals {$heredoc(2+2)}
HEREDOC;

// The same works not only with HEREDOC strings,
// but with double-quoted strings as well:
$string = "{$heredoc(2+2)}";

나는 살펴볼 것이다 똑똑하다 템플릿 엔진으로서 - 저는 다른 엔진을 직접 사용해 본 적이 없지만 잘 해냈습니다.

현재 접근 방식을 고수하고 싶다면 샌즈 템플릿, 출력 버퍼링의 무엇이 그렇게 나쁜가요?호출하려는 함수의 문자열 이름인 변수를 선언하는 것보다 훨씬 더 많은 유연성을 제공합니다.

조금 늦었지만 그래도요.이것은 heredoc에서 가능합니다!

PHP 매뉴얼의 "복잡한(곱슬) 구문" 섹션을 살펴보세요.

@CJDennis 제안을 사용한 좋은 예는 다음과 같습니다.

function double($i)
{ return $i*2; }

function triple($i)
{ return $i*3;}

$tab = 'double';
echo "{$tab(5)} is $tab 5<br>";

$tab = 'triple';
echo "{$tab(5)} is $tab 5<br>";

예를 들어 HEREDOC 구문의 좋은 용도는 데이터베이스에서 마스터-세부 관계가 있는 거대한 양식을 생성하는 것입니다.FOR 컨트롤 내에서 HEREDOC 기능을 사용하여 각 필드 이름 뒤에 접미사를 추가할 수 있습니다.이는 일반적인 서버 측 작업입니다.

당신은 람다 함수를 잊고 있습니다.

$or=function($c,$t,$f){return$c?$t:$f;};
echo <<<TRUEFALSE
    The best color ever is {$or(rand(0,1),'green','black')}
TRUEFALSE;

create_function 함수를 사용할 수도 있습니다.

여러분은 큰따옴표로 묶인 문자열에서도 작동한다는 점에 유의해야 합니다.

http://www.php.net/manual/en/언어.types.string.php

어쨌든 흥미로운 팁입니다.

<div><?=<<<heredoc
Use heredoc and functions in ONE statement.
Show lower case ABC="
heredoc
. strtolower('ABC') . <<<heredoc
".  And that is it!
heredoc
?></div>
<?php
echo <<<ETO
<h1>Hellow ETO</h1>
ETO;

당신은 그것을 시도해야합니다.ETO 종료 후;명령을 입력해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top