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

Jeśli umieścił zmienną w nawiasach klamrowych, wydrukuje się. Ale nie stała. Jak mogę to zrobić? Dziękujemy!Stała interpolująca (nie zmienna) w heredoc?

+0

możliwie wtórnika [określenia i heredoc] (http://stackoverflow.com/questions/8242922/define-and -heredoc) – dsnunez

Odpowiedz

26

Zastosowanie sprintf()

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

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

Miałem ten sam problem i to był mój jedyny sposób. To jest ten sam problem dla metod – haltabush

+1

@haltabush, Możesz użyć funkcji również w ten sam sposób. – Starx

39

Zdaję sobie sprawę, że zostało to już odpowiedział, ale można też podejść do problemu poprzez przypisanie wartości stałej do zmiennej.

Osobiście robię to w ten sposób, ponieważ jeśli masz dużo stałych w swoim ciągu, wtedy twoje sprintfowe połączenie może być dość niechlujne. Jest również trudniej zeskanować ciąg i zobaczyć, co robi co. Dodatkowo, przypisując zmienne indywidualnie, możesz zobaczyć, co bierze na jaką wartość.

Przykładem może być:

$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

Jeśli mam zachować wartości w zmiennych, to dlaczego najpierw zawracam sobie głowę definiowaniem stałych? – FatalError

-3

Połóż zdefiniowanej zmiennej do zmiennej i prostego zastosowania obejmują go w heredoc tak jak w poniższym przykładzie:

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

To jest to samo, co odpowiedź @ Lukeya i nie dodaje nic. – chiliNUT

+2

To jest dużo bardziej zwięzła odpowiedź niż Luke'a. Myślę, że dodaje korzyści zwięzłości. –

4

Można również użyć get_defined_constants funkcję. Kładzie z powrotem wszystkie aktualnie zdefiniowane stałe w tablicy, które można wykorzystać w swoim ciąg heredoc

// 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

Zazwyczaj nie jest to taki dobry pomysł, ponieważ lista będzie dość duża, ponieważ zawiera wszystkie stałe z rdzenia językowego i rozszerzeń, oprócz tych, które naprawdę chcesz. Ręczne przypisywanie ich do zmiennych lokalnych wydaje się być czystsze. – FGM

9

Tutaj jest mały trick, aby umożliwić podwójnych cudzysłowów i heredocs zawierać dowolne wyrażenia w nawiasach klamrowych składni, w tym stałych i inne wywołania funkcji. Wykorzystuje się to, że nazwa funkcji może być przypisany do zmiennej, a następnie wywoływana w ciągu heredoc:

<?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

To świetna sztuczka. Działa również dobrze do wstawiania właściwości klasy statycznej. – hackel

+0

Doskonały do ​​przekazywania obliczonych wartości do heredoc zawierającego skrypt JavaScript. Na początku miałem trochę problemów, ponieważ zapomniałem umieścić cytaty wokół sznurka, który mijam - Duh –