HEREDOC 디렉토리 내에서 PHP 함수 호출
PHP에서 HEREDOC 선언은 html 블록을 출력하는 데 정말 유용합니다. $ 접두사로 변수를 구문 분석 할 수있는 더 복잡한 구문 (예 : $ var [2] [3])의 경우에는 {} 중괄호 안에 넣어야합니다.
PHP 5에서는 입니다 실제로 히어 닥 문자열 안에 {} 중괄호 내에서 함수 호출을 할 수 있지만 약간의 작업을 통해 이동해야합니다 . 함수 이름 자체는 변수에 저장되어야하며 동적으로 이름이 지정된 함수처럼 호출해야합니다. 예를 들면 :
$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
인스턴스를 통과합니다 . 기존의 기존 함수 는 heredoc testfunction()
에서 다음과 같이 호출 할 수 있습니다.{$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를 버퍼에 포함하여 모든 함수 / 메소드를 실행하고 그 과정에서 변수를 할당합니다. 그런 다음 버퍼의 내용을 변수에 기록하고 원하는 작업을 수행하면됩니다.
그렇게하면 바로 그 순간에 페이지에 에코를 표시하지 않으려면 할 필요가 없습니다. 출력하기 전에 반복해서 문자열에 추가 할 수 있습니다.
템플릿 엔진을 사용하지 않으려는 경우 이것이 가장 좋은 방법이라고 생각합니다.
완전성을 위해 !${''}
black magic
parser hack을 사용할 수도 있습니다 .
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)}";
Smarty 를 템플릿 엔진으로 살펴 보겠습니다. 다른 엔진을 직접 사용 해본 적은 없지만 잘 해냈습니다.
템플릿이 아닌 현재의 접근 방식을 고수하고 싶다면 출력 버퍼링이 왜 그렇게 나쁜가요? 호출하려는 함수의 스팅 이름 인 변수를 선언하는 것보다 훨씬 더 많은 유연성을 제공합니다.
조금 늦었지만 여전히. 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/language.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 종료 후; 명령을 입력해야합니다.
참고 URL : https://stackoverflow.com/questions/104516/calling-php-functions-within-heredoc-strings
'IT' 카테고리의 다른 글
Android에서 두 드로어 블 비교 (0) | 2020.09.13 |
---|---|
VSCode에서 파일에 대한 일부 변경 사항을 커밋면해야 할 사항은 적용하지 않을까요? (0) | 2020.09.13 |
새 사용자를 만드는 SQL Server 펼쳐보기 (0) | 2020.09.13 |
iPhone : 탐색 막대로 모달 UITableViewController 표시 (0) | 2020.09.13 |
이동을 목록으로 변환 (0) | 2020.09.13 |