2012-04-06 25 views
24
<?php 
    define('my_const', 100); 
    echo <<<MYECHO 
     <p>The value of my_const is {my_const}.</p> 
MYECHO; 
?> 

如果我把大括號內的變量打印出來。但不是恆定的。我該怎麼做? 謝謝!將常量(不可變)插入heredoc?

+0

可能重複的[定義和定界符(http://stackoverflow.com/questions/8242922/define-and -heredoc) – dsnunez 2014-08-14 12:59:04

回答

26

使用sprintf()

define('my_const', 100); 
$string = <<< heredoc 
     <p>The value of my_const is %s.</p> 
heredoc; 

$string = sprintf($string, my_const); 
+0

我有同樣的問題,這是我唯一的方法。對於方法 – haltabush 2012-04-06 09:12:40

+1

@haltabush也是一樣的問題,你也可以用同樣的方法使用函數。 – Starx 2012-04-06 09:13:42

39

我知道,這已經已經回答了,但你也可以通過常量的值賦值給一個變量解決這個問題。

我個人是這麼做的,因爲如果你的字符串中有很多常量,那麼你的sprintf調用可能會非常混亂。這也很難掃描字符串,看看什麼在做什麼。另外,通過分別分配變量,您可以看到正在採取什麼值。

一個例子是:

$const = CONST; 
$variable = VARIABLE; 
$foo = (new Foo)->setFooProperty(12)->getFooProperty(); 
$bar = (123 - 456) * 10; 
$ten = 1 + 2 + 1 + (5 - 4); 
<<<EOD 
Lorem ipsum dolor sit amet, **$variable** adipiscing elit. 
Duis gravida aliquet dolor quis gravida. 
Nullam viverra urna a velit laoreet, et ultrices purus condimentum. 
Ut risus tortor, facilisis sed porta eget, semper a augue. 
Sed adipiscing erat non sapien commodo volutpat. 
Vestibulum nec lectus sed elit dictum accumsan vel adipiscing libero. 
**$const** vehicula molestie sapien. 
Ut fermentum quis risus ut pellentesque. 
Proin in dignissim erat, eget molestie lorem. Mauris pretium aliquam eleifend. 
**$foo** vitae sagittis dolor, quis sollicitudin leo. 
Etiam congue odio sit amet sodales aliquet. 
Etiam elementum auctor tellus, quis pharetra leo congue at. Maecenas sit amet ultricies neque. 
Nulla luctus enim libero, eget elementum tellus suscipit eu. 
Suspendisse tincidunt arcu at arcu molestie, a consequat velit elementum. 
Ut et libero purus. Sed et magna vel elit luctus rhoncus. 
Praesent dapibus consectetur tortor, vel **$bar** mauris ultrices id. 
Mauris pulvinar nulla vitae ligula iaculis ornare. 
Praesent posuere scelerisque ligula, id tincidunt metus sodales congue. 
Curabitur lectus urna, porta sed molestie ut, mollis vitae libero. 
Vivamus vulputate congue **$ten**. 
EOD; 
+0

如果我要在變量中保存值,那麼爲什麼首先要定義常量呢? – FatalError 2018-03-01 15:04:09

-3

把你定義的變量爲簡單的變量和使用它包括在定界符就像在下面的例子:

<?php 
define('my_const', 100); 
$variable = my_const; 
    echo <<<MYECHO 
     <p>The value of my_const is {$variable}.</p> 
MYECHO; 
?> 
+5

這與@ Lukey的回答是一樣的,不會添加任何內容 – chiliNUT 2014-11-20 22:06:46

+2

這比@ Lukey的答案要簡單得多。我認爲它增加了簡潔的好處。 – 2017-03-16 16:35:17

4

您還可以使用get_defined_constants功能。它把後面所有當前定義的常量數組中,您可以在您的定界符字符串中使用

// Let's say there is FOO and BAR defined 
$const = get_defined_constants(); 

$meta = <<< EOF 
    my awesome string with "{$const['FOO']}" and "{$const['BAR']}" constants 
EOF; 
+5

這通常不是一個好主意,因爲列表將會非常大,因爲它包含了除了你真正想要的語言核心和擴展之外的所有常量。手動將它們分配給局部變量似乎更清晰。 – FGM 2016-08-28 14:23:48

9

這裏有一個小竅門,讓雙引號字符串和here文檔包含在大括號中的語法,包括常量任意表達式和其他函數調用。它使用一個函數名可以被分配給一個變量,然後稱爲定界符內的事實:

<?php 

// Declare a simple function 
function _placeholder($val) { return $val; } 
// and assign it to something short and sweet 
$_ = '_placeholder'; 

// or optionally for php version >= 5.3 
// Use a closure (anomynous function) like so: 
$_ = function ($val){return $val;}; 

// Our test values 
define('abc', 'def'); 
define('ghi', 3); 

$a=1; 
$b=2; 

function add($a, $b) { return $a+$b; } 

// Usage 
echo "b4 {$_(1+2)} after\n"; // outputs 'b4 3 after' 
echo "b4 {$_(abc)} after\n"; // outputs 'b4 def after' 
echo "b4 {$_(add($a, $b)+ghi*2)} after\n"; // outputs 'b4 9 after' 
$text = <<<MYEND 

Now the same in heredoc: 
b4 {$_(1+2)} after 
b4 {$_(abc)} after 
b4 {$_(add($a, $b)+ghi*2)} after 

MYEND; 
echo $text; 
+1

這是一個很棒的伎倆。也適用於插入靜態類屬性。 – hackel 2017-03-11 01:08:57

+0

非常適合將計算值傳遞給包含JavaScript腳本的heredoc。起初有點麻煩,因爲我忘記在我傳遞的字符串周圍引用 - 杜 – 2018-02-14 21:49:14