Bitiştirmekten olmadan dize sabiti dahil

8 Cevap php

Bitiştirmekten olmadan bir dizge içinde bir sabit eklemek için PHP bir yolu var mı?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

8 Cevap

Hayır.

Dizeler, PHP dize verileri ve sabit tanımlayıcılarını ayırt etmek için hiçbir yolu yoktur. Bu yorumlu metin dahil olmak üzere PHP dize biçimlerden herhangi gider.

constant() sabit tutmak için alternatif bir yoldur, ancak bir işlev çağrısı birleştirme olmadan bir dize koymak mümkün değildir, ne.

Manual on constants in PHP

Sen yapabilirsin:

define( 'FOO', 'bar' );

$constants = get_defined_constants();
$constants = $constants[ 'user' ];

echo "Hello, my name is {$constants['FOO']}";

Dizeleri içinde sabitlerini kullanmak için aşağıdaki yöntemi kullanabilirsiniz:

define( 'ANIMAL', 'turtles' ); 
$constant = 'constant';

echo "I like {$constant('ANIMAL')}";


How does this work?

You can use any string function name and arbitrary parameters

Bir değişkenin herhangi bir işlev adını koyun ve bir çift tırnaklı dizge içinde parametreleri ile çağırabilirsiniz. De birden fazla parametre ile çalışır.

$fn = 'substr';

echo "I like {$fn('turtles!', 0, -1)}";

Üretir

I like turtles

Anonymous functions too

Ayrıca PHP 5.3 + koşuyoruz sağladığı anonim işlevlerini kullanabilirsiniz.

$escape   = function ( $string ) {
    return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );

Üretir properly escaped html as expected.

Callback arrays not allowed!

Şimdi size işlev adı herhangi çağrılabilir olabilir izlenimi altında iseniz bir dize içinde kullanıldığında geçirilen zaman true döndüren bir dizi is_callable ölümcül bir hataya neden olur gibi, bu, böyle değil:

class Arr
{

    public static function get( $array, $key, $default = null )
    {
        return is_array( $array ) && array_key_exists( $key, $array ) 
            ? $array[$key] 
            : $default;
    }
}

$fn = array( 'Arr', 'get' );
var_dump( is_callable( $fn ) ); // outputs TRUE

// following line throws Fatal error "Function name must be a string"
echo( "asd {$fn( array( 1 ), 0 )}" ); 

Keep in mind

Bu uygulama, tedbirsiz, ama bazen çok daha okunabilir kod sonuçlanır, bu yüzden size kalmış - olasılığı vardır.

Ben bu OP'ın özgün soru cevaplar inanıyorum. Tek şey globallerinin dizin anahtar sadece küçük harf olarak çalışmak gibi görünüyor olduğunu.

define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";

Çıktı:

DB_USER=root

Bu ad gezerken dağıtıp önlemek için fonksiyon için bir isim olarak anahtar kelime 'const' kullanabileceğiniz eğlenceli:

define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST

Ayrıca tüm kod üzerinde 'const' işlevi yaymak için $ GLOBALS kullanabilirsiniz:

$GLOBALS['const'] = function($a){return $a;};

Emin kullanarak gelecek için güvenlidir. Ve ne kötüdür - hala çirkin görünüyor bulunuyor.

Evet (;) bir şekilde) 'dir:

define('FOO', 'bar');

$test_string = sprintf('This is a %s test string', FOO);

Bu hedefleyen ne muhtemelen değildir, ama teknik olarak bu birleştirme ama bir ikame değildir ve bu varsayımdan, bu includes a constant in a string without concatenating, düşünüyorum.

Eğer gerçekten want to echo constant without concatenation burada çözüm ise:

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';

note: Bu örnekte yankı içinde bir dizi parametre (look at the commas), bu gerçek bitiştirme değildir kadar sürer

Bu birleştirmek ve daha sonra echo zorunda değildir çünkü Echo bir fonksiyonu gibi davranır, o, bu birleştirme daha verimli, daha parametreleri alır, sadece :)) yeni Dize birleştirilmiş nesnesi oluşturma gerek kalmadan her şeyi yankıları

EDIT

Eğer concatenating dizeleri, parameters veya yazılı olarak geçiĢlerinin dizeleri whole strings with ", , (virgül sürüm) düşünürsek de gelecek, her zaman en hızlı gider ve ifadeler bu şekilde beyan karşı değerlendirilmelidir yazılı çünkü yavaş dize kurma yöntemi, çift tırnak " kullanıyor . (' tek tırnak ile birleştirme) değişkenleri ve işlevleri ..

Diğerleri işaret gibi bunu yapamam. PHP constant() bir dize doğrudan denilen cant bir işlevi vardır ama biz kolayca çalışabilirsiniz.

$constant = function($cons){
   return constant($cons);
};

ve kullanımı hakkında temel bir örnek:

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}";