2014-09-27 117 views
4

是否可以使用heredoc模板中的函數而不破壞它? Somethig這樣的:是否有可能在heredoc中使用php函數?

<<<HTML 
    <div> showcaptcha(); </div> 
HTML; 

具體我想需要在這其中另一個模板,而無需使用變量。 還是有另一個更簡單的解決方案,不使用heredoc? Thx先進。

對於使用名爲類例如IM需要

class requires { 

public function __construct(){ 
    $this->MYSQL(); 
    $this->FUNC(); 
} 

public function MAIN_MENU() { 
    require_once ('main-menu.tpl'); 
} 

} 

那我該做的index.php

require_once ('requires.php'); 
$req = new requires(); 

echo <<<HTML 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 

//bla bla 

</head> 
<nav><ul class="fancynav"> 
{$req->HEAD_SCRIPTS()} 
</ul></nav> 
HTML; 

主menu.tpl

<li><a href="">Item</a></li> 
<li><a href="">Item</a></li> 
<li><a href="">Item</a></li> 
<li><a href="">Item</a></li> 
<li><a href="">Item</a></li> 

而在結果我有一個空場沒有PHP的錯誤

<nav><ul class="fancynav"> 



</ul></nav> 

跆拳道?

+0

空字段,因爲''HEAD_SCRIPTS()''方法不會返回一些字符串(並且「HEREDOC」中插入的是該方法返回的內容)。使用''return file_get_contents('*。tpl');''來代替''require_once()''。 – Xenos 2014-09-27 22:07:09

+0

我找到了。所需打印文檔頁面的底部,在沒有我的地方設置變量.. – 2014-09-27 22:16:32

回答

0

不,這是不可能用定界符字符串內的功能。

5

是的,你可以使用「encapsed VAR」絕招:

function hello() { 
    global $result; 
    $result = 'hi there!'; 
    return 'result'; 
} 

echo <<<EOF 
text ${hello()} text 
EOF; 

從技術上講,這個工作,但最好避免在生產這樣的黑客。一個臨時變量會更清潔。

+1

*「最好是允許生產這樣的黑客」 *缺少*不*在這裏?不要忘記''全局$結果;''如果''echo'在另一個函數內。 – Xenos 2014-09-27 20:00:25

+0

Thx我明白了。那麼我最好重寫所有的模板。 – 2014-09-27 20:01:13

+1

@ Xenos:當然,謝謝。 – georg 2014-09-27 20:08:15

1

既然你不能直接調用裏面HEREDOC的功能,你可以將一個變量函數的名稱,並使用HEREDOC字符串內部的變量:

$showcaptcha= 'showcaptcha'; 
    echo 
<<<HTML 
    <br/> dawg {$showcaptcha()} dawg 
HTML; 

所以,你可以離開當前的已編碼的功能:

function showcaptcha() 
    { 
     return "Gotta captcha mall"; 
    } 

您還可以使用:

$showcaptcha = function() 
    { 
     return "Gotta captcha mall"; 
    } 
    echo 
<<<HTML 
    <br/> dawg {$showcaptcha()} dawg 
HTML; 

如果調用該函數在同一水平的回聲被定義(否則,你就會有一個全局變量$showcaptcha)。

如果你有幾個功能,可以使定界符前一個循環:

function dawg() 
    { 
     return "I'm loyal"; 
    } 
    function cat() 
    { 
     return "I'm cute"; 
    } 
    function fish() 
    { 
     return "I'm small"; 
    } 
    function elephant() 
    { 
     return "I'm big"; 
    } 

    $functionsToCall = array('elephant', 'fish', 'cat', 'dawg'); 
    foreach ($functionsToCall as $functionToCall) 
     $$functionToCall = $functionToCall; 
    echo 
<<<HTML 
    <br/> Dawg: {$dawg()} 
    <br/> Cat: {$cat()} 
    <br/> Fish: {$fish()} 
    <br/> Elephant: {$elephant()} 
HTML; 

這就是這樣少醜不是使用全局變量

+0

如果你正在使用一個臨時變量,你根本不需要這個封裝技巧。只需插入它通常。 – georg 2014-09-27 20:09:18

+0

@georg對不起,我不明白...你是什麼意思? – Xenos 2014-09-27 20:11:28

+1

'$ temp = func(); echo <<< HTML $ temp HTML;' – georg 2014-09-27 20:11:58

相關問題