PHP dizesinde kıvırcık parantez


Yanıtlar:


281

Bu, dize enterpolasyonu için karmaşık (kıvırcık) sözdizimidir . Kılavuzdan:

Karmaşık (kıvırcık) sözdizimi

Bu sözdizimi karmaşık olduğu için karmaşık değil, karmaşık ifadelerin kullanılmasına izin verdiği için karmaşık olarak adlandırılmaz.

Dize temsili olan herhangi bir skaler değişken, dizi öğesi veya nesne özelliği bu sözdizimi aracılığıyla dahil edilebilir. O dize dışında göründüğü şekilde Basitçe ifadeyi aynı şekilde yazmak ve sonra sarın {ve }. Yana {zaman kaçmış olamaz, bu sözdizimi sadece tanınacak $hemen izler {. {\$Değişmez bilgi almak için kullanın {$. Açıklığa kavuşturmak için bazı örnekler:

<?php
// Show all errors
error_reporting(E_ALL);

$great = 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// Works
echo "This square is {$square->width}00 centimeters broad."; 


// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";


// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong  outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}"; 

// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";

// Won't work, outputs: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>

Genellikle, bu sözdizimi gereksizdir. Örneğin, bu:

$a = 'abcd';
$out = "$a $a"; // "abcd abcd";

tam olarak aynı şekilde davranır:

$out = "{$a} {$a}"; // same

Bu yüzden kıvırcık parantezler gereksizdir. Ancak bu :

$out = "$aefgh";

hata seviyenize bağlı olarak, çalışmayan veya adlı bir değişken olmadığından bir hata üretecektir $aefgh, bu yüzden yapmanız gerekenler:

$out = "${a}efgh"; // or
$out = "{$a}efgh";

40
kopyalama / yapıştırma hakkında çok fazla anal nitpicking. Eğer anlamayı / bulmayı kolaylaştırırsa, o zaman iyi bir karardı. Benden +1, tam olarak aradığım şeydi ve PHP el kitabında bulamadım - belki de doğru isimle ya da her neyse çağırıyorlardı. Ama burada buldum.
Gabriel Magana

9
Değişmez kıvrımlar için bunları ikiye katlayın, örn $vars='x:3,y:9'; $json="{{$vars}}";. QiGuang'ın makalesine teşekkürler .
Bob Stein

... Veya $out = '$aefgh'; (kelimenin tam anlamıyla $ aefgh'e ihtiyacınız varsa)
Roko C. Buljan

İlginç kullanım örneği örneği SimpleXMLElement: {}düğümün kendisine erişmek için kullanılır, ör $element[0]->{0}. "0" özelliği bulunamadığından, bu __get/ __setmetodu tetikleyecektir . Bu özünde, ArrayAccessdizin erişimi için bir alternatif sağlar , örneğin 3v4l.org/1F254 .
Gajus

2
Değişken kıvırcık parantez içindeki bir içerik de değişkenler içeriyorsa, her değişkene kıvırcık parantez ekleyin : $min=1;$max=5; echo ".{{$min},{$max}}"verimler .{1,5}(@ BobStein'in yorumunda bahsedilen "kıvırcık [parantez]] 'in nerede olduğunu bilerek sorun yaşadım)
Xenos

47

Bana gelince, kıvırcık parantez birleştirme yerine geçer, yazım daha hızlıdır ve kod daha temiz görünür. İçeriği PHP tarafından ayrıştırılırken çift ​​tırnak işareti ("") kullanmayı unutmayın , çünkü tek tırnak işaretlerinde ('') sağlanan değişkenin gerçek adını alırsınız :

<?php

 $a = '12345';

// This works:
 echo "qwe{$a}rty"; // qwe12345rty, using braces
 echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used

// Does not work:
 echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
 echo "qwe$arty"; // qwe, because $a became $arty, which is undefined

?>

1
"içerikleri PHP tarafından ayrıştırılıyor" - Bu yanıltıcı. Sen olamaz sadece demek için okumuştum ne küme ayracı sözdizimi, içeride keyfi PHP ifadeleri koydu.
Mark Amery

1
IMO, genel olarak, parantezle yazmak daha hızlı değildir. SHIFTÇift tırnaklar ve süslü parantezler için tuşa basmanız gerekir . Kesinlikle çift tırnak kullanırsanız daha hızlı olurdu.
deflime

2
Çift tırnak v tek tırnak, +1
cameronjonesweb

Ben evaluateyerine kullanacağımparse
Cholthi Paul Ttiopic

17

Misal:

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

Kıvırcık parantez olmadan PHP adlı bir değişken bulmaya çalışır $numberth, bu mevcut değildir!


3

Ayrıca, öznitelik adlarının bazı yineleyiciye göre değiştiği nesne özniteliklerine erişmek için yararlı buldum. Örneğin, aşağıdaki deseni bir dizi zaman aralığı için kullandım: saat, gün, ay.

$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
    $this->{'value_'.$period}=1;
}

Aynı model sınıf yöntemlerine erişmek için de kullanılabilir. Yöntem adını dizeleri ve dize değişkenlerini kullanarak aynı şekilde oluşturun.

Dönem bazında değer depolaması için sadece bir dizi kullanmayı kolayca tartışabilirsiniz. Bu uygulama sadece PHP olsaydı, kabul ediyorum. Sınıf bir veritabanı tablosundaki alanlara öznitelik eşleştirdiğinde bu deseni kullanın. Dizileri serileştirme kullanarak bir veritabanında saklamak mümkün olsa da, verimsizdir ve münferit alanların endekslenmesi gerekip gerekmediği anlamsızdır. Her iki dünyanın da en iyileri için genellikle yineleyici tarafından anahtarlanan alan adlarının bir dizisini eklerim.

class timevalues
{
                             // Database table values:
    public $value_hour;      // maps to values.value_hour
    public $value_day;       // maps to values.value_day
    public $value_month;     // maps to values.value_month
    public $values=array();

    public function __construct()
    {
        $this->value_hour=0;
        $this->value_day=0;
        $this->value_month=0;
        $this->values=array(
            'hour'=>$this->value_hour,
            'day'=>$this->value_day,
            'month'=>$this->value_month,
        );
    }
}

-5

İşte bir wordpress eklentisinden aldığım kod

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

Bu, karmaşık dizeleri biçimlendirmek için gerçekten kullanışlı bir tekniktir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.