2012-04-06 95 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