PHP 함수 호출(REEDOC 문자열 내)
PHP에서 GREEDOC 문자열 선언은 html 블록을 출력하는 데 매우 유용합니다.변수 앞에 $를 붙이는 것만으로 해석할 수 있지만, 더 복잡한 구문(예: $var[2][3])의 경우 {}개의 중괄호 안에 식을 넣어야 합니다.
PHP 5에서는 실제로 GELEDOC 문자열 내의 {} 괄호 내에서 함수 호출을 할 수 있지만 약간의 작업을 거쳐야 합니다.함수 이름 자체는 변수에 저장해야 하며 동적으로 명명된 함수인 것처럼 호출해야 합니다.예를 들어 다음과 같습니다.
$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;
첫 번째 코드 예시 외에 다른 방법이 있습니다.예를 들어 함수를 호출하기 위해 GREEDOC를 해제하거나 문제를 반전시켜 다음과 같은 작업을 수행합니다.
?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>
후자는 출력이 출력 스트림에 직접 입력된다는 단점이 있습니다(출력 버퍼링을 사용하지 않는 한). 원하는 출력이 아닐 수 있습니다.
그래서 제 질문의 본질은 이것보다 더 우아한 방법이 있을까요?
응답에 따라 편집:확실히 템플릿 엔진 같은 것이 있으면 생활이 훨씬 쉬워질 것 같지만, 기본적으로는 평소 PHP 스타일을 뒤집어야 합니다.그게 나쁜 건 아니지만, 그게 내 관성을 설명해 주는군.하지만 나는 삶을 더 쉽게 만들 방법을 찾고 있어. 그래서 나는 지금 템플릿을 찾고 있어.
이 작업을 수행하지만 클래스를 사용하는 것보다 조금 더 간단한 경우 다음을 사용할 수 있습니다.
function fn($data) {
return $data;
}
$fn = 'fn';
$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;
개인적으로는 전혀 GELEDOC를 사용하지 않을 겁니다.단지, 「템플릿 빌딩」시스템이 좋은 것은 아닙니다.모든 HTML이 몇 가지 단점이 있는 문자열에 잠겨 있습니다.
- WYSIWYG 옵션 없음
- IDE에서 HTML에 대한 코드가 완료되지 않음
- 출력(HTML)이 논리 파일에 잠김
- 결과적으로 루프와 같은 복잡한 템플리트를 실현하기 위해 지금 시도하고 있는 것과 같은 해킹을 사용해야 합니다.
엔진을 가져오거나수에는 "PHP"가 . 그래서 언어에는<?php
★★★★★★★★★★★★★★★★★」?>
구분 기호로 지정합니다.
template_file.module
<html>
<head>
<title><?php echo $page_title; ?></title>
</head>
<body>
<?php echo getPageContent(); ?>
</body>
index.displaces를 표시합니다.
<?php
$page_title = "This is a simple demo";
function getPageContent() {
return '<p>Hello World!</p>';
}
include('template_file.php');
다음과 같이 하겠습니다.
$string = <<< heredoc
plain text and now a function: %s
heredoc;
$string = sprintf($string, testfunction());
이게 더 우아하다고 생각하실지 모르겠지만...
높이기 위해 ""를 .!${''}
흑마법 파서 해킹:
echo <<<EOT
One month ago was ${!${''} = date('Y-m-d H:i:s', strtotime('-1 month'))}.
EOT;
다음을 수행합니다(글로벌 변수 또는 필요할 때 인스턴스화).
<?php
class Fn {
public function __call($name, $args) {
if (function_exists($name)) {
return call_user_func_array($name, $args);
}
}
}
$fn = new Fn();
?>
시점에서 호출은 모두 를 합니다.$fn
so. 즉, 함수 존존능은은 the the thetestfunction()
으로 수 {$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가 버퍼에 포함되어 함수/메서드를 실행하고 중간에 변수를 할당합니다.그런 다음 버퍼의 내용을 변수에 기록하고 원하는 작업을 수행합니다.
그렇게 하면, 그 순간에 페이지에 에코 하고 싶지 않으면, 그렇게 할 필요가 없습니다.출력하기 전에 문자열을 루프하여 계속 추가할 수 있습니다.
템플리트 엔진을 사용하지 않으려면 그게 가장 좋은 방법인 것 같아요.
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)}";
이 스니펫에서는 사용자 범위 내에서 정의된 함수의 이름으로 변수를 정의하고 동일한 이름을 포함하는 문자열에 바인드합니다.내가 입증 해볼게.
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;
이제 작동한다.
HTML 코드 생성에는 geredoc을 사용하는 것이 좋다고 생각합니다.예를 들어, 다음 내용은 거의 읽을 수 없습니다.
<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;
유감스럽게도 질문에서 함수를 변수에 바인드하는 것은 좋은 제안이었지만, 결국 코드에 복잡성 수준을 더해 가치가 없고 코드를 읽기 어렵게 만드는 것이 유전의 주요 장점입니다.
이것은 오늘날 php 7.x에서 조금 더 우아합니다.
<?php
$test = function(){
return 'it works!';
};
echo <<<HEREDOC
this is a test: {$test()}
HEREDOC;
저는 Smarty를 템플릿 엔진으로 보고 싶습니다.다른 것은 시도해 본 적이 없지만, 좋은 결과를 얻었습니다.
현재의 접근 방식인 SAN 템플릿을 계속 사용하고 싶다면 출력 버퍼링의 나쁜 점은 무엇입니까?호출하는 함수의 문자열 이름인 변수를 선언하는 것보다 훨씬 더 유연합니다.
람다 함수를 잊은 경우:
$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 함수를 사용할 수도 있습니다.
조금 늦었지만 여전히.이건 유전적으로 가능한 일이야!
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>";
예를 들어, 데이터베이스에 마스터와 세부 관계가 있는 거대한 형식을 생성하는 것이 GEEDOC 구문의 좋은 사용 방법입니다.FOR 컨트롤 내에서 각 필드 이름 뒤에 접미사를 추가하는 GEEDOC 기능을 사용할 수 있습니다.전형적인 서버측 작업입니다.
남자들은 두 따옴표로 묶은 문자열에서도 작동한다는 것을 알아둬야 한다.
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
'programing' 카테고리의 다른 글
JUnit에서는 assertNotEquals 메서드가 제공되지 않는 이유는 무엇입니까? (0) | 2023.01.21 |
---|---|
자동 증가 시작 번호를 변경하시겠습니까? (0) | 2023.01.21 |
generator.next()는 Python 3에 표시됩니까? (0) | 2023.01.21 |
Larabel 5 관계를 쿼리하면 "null에서 멤버 함수 addEagerConstraints() 호출" 오류가 발생합니다. (0) | 2023.01.21 |
날짜 범위로부터 일수를 생성하다 (0) | 2023.01.21 |