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

Değişken diş tellerinin içine bir değişken koyarsam. Ama sabit değil. Nasıl yapabilirim? Teşekkür ederiz!Heredoc içine sabit (değişken olmayan) interpolate?

+0

mümkün kopya [tanımlar ve heredoc] (http://stackoverflow.com/questions/8242922/define-and: Bu fonksiyon adı metin bildiriminde içinde bir değişkene atanan ve daha sonra çağrılabilir gerçeğini kullanır -heredoc) – dsnunez

cevap

26

Kullanım sprintf()

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

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

Aynı problem vardı ve benim tek yolumdu. – haltabush

+1

@haltabush metodları için aynı problemdir, Fonksiyonu da aynı şekilde kullanabilirsiniz. – Starx

39

bu zaten yanıtlandı farkındayım, ama aynı zamanda bir değişkene sabit değerini atayarak sorunu yaklaşabilir.

Şahsen böyle yapıyorum çünkü dizinizde çok fazla sabit varsa, sprintf çağrılarınız oldukça dağınık olabilir. Dize boyunca taramak ve ne yaptığını görmek de o zaman daha zordur. Ayrıca, değişkenleri ayrı ayrı atayarak, neyin değerini aldığını görebilirsiniz.

şöyle bir örnek verilebilir:

$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

Değerleri değişkenler arasında tutacağım, o zaman neden ilk başta sabitleri tanımlamak zordu? – FatalError

-3

basit değişken ve kullanıma içine tanımlı değişken koy sadece aşağıdaki örnekte olduğu gibi bir yorumlu metin içinde yer alıyor:

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

Bu, @ Lukey'in cevabı ile aynıdır ve hiçbir şey eklemez – chiliNUT

+2

Bu, @ Lukey'in yanıtından çok daha özlüdür. Bence kısırlığın yararını ekler. –

4

Ayrıca get_defined_constants işlevini kullanabilirsiniz. Bu İşte

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

Bu çok iyi bir fikir değildir, çünkü liste oldukça büyüktür, çünkü dil özünden ve uzantılardan gelen tüm sabitleri gerçekten istediğiniz şeylere ek olarak içerir. Bunları yerel değişkenlere manuel olarak atamak daha temiz görünüyor. – FGM

9

çift tırnaklı dizeleri ve yorumlu metinler sabitleri dahil küme parantezleri sözdizimi, keyfi ifadeler içermesini mümkün kılmak için bir küçük hiledir sizin heredoc dizede kullanabilecekleri bir dizi içinde olan tüm tanımlanmış sabitleri geri koyar ve diğer işlev çağrıları. arasında

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

Bu harika bir oyun. Ayrıca statik sınıf özellikleri eklemek için iyi çalışır. – hackel

+0

Hesaplanmış değerleri bir JavaScript komut dosyası içeren bir heredoc'a geçirmek için harika çalıştı. İlk başta biraz sıkıntı çektim çünkü geçtiğim dizenin etrafına tırnak koymayı unuttum - Duh –

İlgili konular