PHP'de bir dizeye birleştirme yapmadan bir sabit eklemenin bir yolu var mı?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
PHP'de bir dizeye birleştirme yapmadan bir sabit eklemenin bir yolu var mı?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
Yanıtlar:
Hayır.
Dizeler ile PHP'nin sabit tanımlayıcılar dışında dize verilerini söylemesinin bir yolu yoktur. Bu, heredoc dahil olmak üzere PHP'deki dize biçimlerinden herhangi biri için geçerlidir.
constant()
bir sabiti tutmanın alternatif bir yoludur, ancak bir işlev çağrısı, birleştirme olmadan bir dizeye yerleştirilemez.
define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
Evet (bir şekilde;)):
define('FOO', 'bar');
$test_string = sprintf('This is a %s test string', FOO);
Muhtemelen amaçladığınız şey bu değil, ama bence, teknik olarak bu birleştirme değil, bir ikame ve bu varsayımdan, bir dizede birleştirmeden bir sabit içeriyor .
Dizelerin içindeki sabitleri kullanmak için aşağıdaki yöntemi kullanabilirsiniz:
define( 'ANIMAL', 'turtles' );
$constant = 'constant';
echo "I like {$constant('ANIMAL')}";
Bir değişkene herhangi bir işlev adı yerleştirilebilir ve çift tırnaklı bir dize içindeki parametrelerle çağırılabilir. Çoklu parametrelerle de çalışır.
$fn = 'substr';
echo "I like {$fn('turtles!', 0, -1)}";
üretir
kaplumbağaları severim
PHP 5.3+ çalıştırıyorsanız, anonim işlevleri de kullanabilirsiniz.
$escape = function ( $string ) {
return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
Beklendiği gibi düzgün kaçan html üretir.
Şimdiye kadar, işlev adının herhangi bir çağrılabilir olabileceği izlenimi altındaysanız, is_callable
bir dizede kullanıldığında ölümcül bir hataya neden olacağı için, iletildiğinde true döndüren bir dizi söz konusu değildir :
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 )}" );
Bu uygulama tavsiye edilmez, ancak bazen çok daha okunabilir bir kodla sonuçlanır, bu yüzden size kalmış - olasılık var.
$_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"
. Thetaiko'nun sürümü tırnak ihtiyacını ortadan kaldırıyor ve bir alt çizgi sevimli.
define( 'FOO', 'bar');
$FOO = FOO;
$string = "I am too lazy to concatenate $FOO in my string";
Eğer gerçekten birleştirme olmadan sabit yankı istiyorsanız burada çözüm:
define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';
not : bu örnekte echo bir dizi parametre alır ( virgüllere bakın ), bu yüzden gerçek birleştirme değildir
Yankı bir işlev gibi davranır, daha fazla parametre alır, birleştirme işleminden daha etkilidir, çünkü birleştirmek ve daha sonra yankı yapmak zorunda değildir, yeni String birleştirilmiş nesne yaratmaya gerek kalmadan her şeyi yankılanır :))
DÜZENLE
Göz önünde Ayrıca birleştirerek olarak dizeleri, geçişleri dizeleri parametreleri veya yazma ile tüm dizeleri " , (virgül versiyonu) her zaman en hızlı, ertesi gider edilir . (İle birleştirme ' tek tırnak) ve yöntemi bina yavaş dize çift tırnak kullanıyor " , çünkü bu şekilde yazılan ifadelerin beyan edilen değişkenlere ve fonksiyonlara göre değerlendirilmesi gerekir.
En kolay yol
define('MY_CONSTANT', 42);
$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";
Kullanmanın başka bir yolu (s)printf
define('MY_CONSTANT', 42);
// Note that %d is for numeric values. Use %s when constant is a string
printf('This is my constant: %d', MY_CONSTANT);
// Or if you want to use the string.
$my_string = sprintf('This is my constant: %d', MY_CONSTANT);
echo $my_string;
Diğerlerinin işaret ettiği gibi bunu yapamazsınız. PHP, bir constant()
dizede doğrudan çağrılamayan bir işleve sahiptir, ancak kolayca bu sorunu çözebiliriz.
$constant = function($cons){
return constant($cons);
};
ve kullanımı hakkında temel bir örnek:
define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}";
$constant = 'constant';
Başka bir işlev tanımlamak yerine bunu yapabilirsiniz ve bu işlev zaten mevcut olduğundan, aynı şekilde çalışır.
Aşağıda, çoğunlukla "{$}" numarasına odaklanmış gibi görünen diğer cevaplara bazı alternatifler verilmiştir. Hızları konusunda hiçbir garanti verilmese de; bunların hepsi saf sözdizimsel şekerdir. Bu örnekler için, aşağıdaki sabitler kümesinin tanımlandığını varsayacağız.
define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );
Extract () kullanılması
Bu, hoş bir sonuçtur çünkü sonuç değişkenlerle aynıdır. İlk önce yeniden kullanılabilir bir fonksiyon oluşturursunuz:
function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }
Sonra herhangi bir kapsamdan arayın:
extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";
Burada, sabitleri parmaklarınızda daha kolay olacak şekilde indirir, ancak olduğu gibi tutmak için array_change_key_case () öğesini kaldırabilirsiniz. Zaten çakışan yerel değişken adlarınız varsa, sabitler bunları geçersiz kılmaz.
Dize değiştirmeyi kullanma
Bu, sprintf () öğesine benzer, ancak tek bir değiştirme jetonu kullanır ve sınırsız sayıda bağımsız değişkeni kabul eder. Eminim bunu yapmanın daha iyi yolları vardır, ama becerikliğimi affedin ve arkasındaki fikre odaklanmaya çalışın.
Daha önce olduğu gibi, yeniden kullanılabilir bir işlev oluşturursunuz:
function fill(){
$arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr );
while( strpos( $s, '/' ) !== false ){
$s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr );
} return $s;
}
Sonra herhangi bir kapsamdan arayın:
$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );
% Veya # gibi istediğiniz herhangi bir belirteç kullanabilirsiniz. Buradaki eğik çizgiyi kullandım çünkü yazmak biraz daha kolay.
Ad alanı çöplüğünü önlemek için 'const' anahtar sözcüğünü işleviniz için bir ad olarak kullanabilmeniz eğlencelidir:
define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST
'GLTAL' işlevini kodun her yerine yaymak için $ GLOBALS komutunu da kullanabilirsiniz:
$GLOBALS['const'] = function($a){return $a;};
İleride kullanmak için güvenli olduğundan emin değilim. Ve daha da kötüsü - hala çirkin görünüyor.
Bunun OP'nin orijinal sorusuna cevap verdiğine inanıyorum. Tek şey, küresel dizin anahtarının sadece küçük harf gibi çalıştığıdır.
define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";
Çıktı:
DB_USER=root
an associative array containing references to all variables
.
$db_user = 'root';