PHPの文字列に中括弧


回答:


281

これは、文字列補間の複雑な(カーリー)構文です。マニュアルから:

複雑な(カーリー)構文

構文は複雑なので、これは複雑とは呼ばれませんが、複雑な式を使用できるためです。

この構文を使用して、文字列表現を持つスカラー変数、配列要素、またはオブジェクトプロパティを含めることができます。それは文字列の外側に現れる同様に式を書き、その後でそれをラップ{して}。以来{エスケープすることができないとき、この構文にのみ認識されます$、すぐに次の{{\$リテラルを取得するために使用 します{$。それを明確にするいくつかの例:

<?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()}";
?>

多くの場合、この構文は不要です。たとえば、これ:

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

これはまったく同じように動作します:

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

したがって、中括弧は不要です。しかし、これ

$out = "$aefgh";

というエラーレベルに応じて、という名前の変数がないため、機能しないか、エラーが発生するため$aefgh、次のようにする必要があります。

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

40
コピー/貼り付けについてあまりにも多くの肛門のつまらない。それが理解/発見を容易にするなら、それは良い決断でした。私からの+1、それはまさに私が探していたものであり、PHPマニュアルでは見つかりませんでした。おそらく、適切な名前などで呼ばれているためです。しかし、私はそれをここで見つけました。
ガブリエルマガナ

9
リテラルカーリーの場合は、2倍にします$vars='x:3,y:9'; $json="{{$vars}}";QiGuangの記事に感謝します
ボブスタイン

...または$out = '$aefgh'; (文字通り$ aefghが必要な場合)
Roko C. Buljan 14

興味深い使用例はあるSimpleXMLElement{}例えば、ノード自体にアクセスするために使用されます$element[0]->{0}。プロパティ「0」は存在できないため、これにより__get/ __setメソッドがトリガーされます。これにより、本質的にはArrayAccess、インデックスアクセスの代替手段、たとえば3v4l.org/1F254が可能になります。
Gajus 2014

2
リテラル中括弧内のコンテンツがあまりにも変数が含まれている場合は、にカーリーブレースを追加し、すべての変数:$min=1;$max=5; echo ".{{$min},{$max}}"利回り.{1,5}(私はトラブルがBobSteinさんのコメント@にmentionned「[中括弧]ダブルアップ」に知っていた)
Xenosの

46

私にとっては、中かっこは連結の代わりとして機能します。中かっこは入力が速く、コードがよりきれいに見えます。コンテンツはPHPによって解析されるため、二重引用符( "")を使用することを忘れないでください。単一引用符( '')では、提供された変数のリテラル名が得られるからです。

<?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
「それらのコンテンツはPHPによって解析されます」 -これは誤解を招くものです。中括弧の構文内に任意のPHP式を置くことはできません
Mark Amery

1
IMO全体として、ブラケットを使用して入力する方が速くはありません。あなたはに持っているSHIFT二重引用符のためにと、中括弧のためにキーを押します。ただし、二重引用符を厳密に使用すると、より速くなります。
16年

2
二重引用符と一重引用符を強調表示していただきありがとうございます。+ 1
cameronjonesweb

evaluate代わりに使用しますparse
Cholthi Paul Ttiopic

17

例:

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

中括弧がなければ、PHPはという変数を見つけようとしますが$numberth、それは存在しません!


3

また、属性名がイテレータによって異なるオブジェクト属性にアクセスすることも便利です。たとえば、以下のパターンを一連の期間(時間、日、月)に使用しました。

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

これと同じパターンを使用して、クラスメソッドにアクセスすることもできます。文字列と文字列変数を使用して、同じ方法でメソッド名を作成するだけです。

期間ごとに値を格納するために配列を使用することは簡単に主張できます。このアプリケーションがPHPのみである場合、私は同意します。クラス属性がデータベーステーブルのフィールドにマップするときに、このパターンを使用します。シリアル化を使用してデータベースに配列を格納することは可能ですが、効率が悪く、個々のフィールドにインデックスを付ける必要がある場合は無意味です。私はしばしば、両方の長所を生かすために、イテレーターによってキー設定されたフィールド名の配列を追加します。

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

これは私が1つのワードプレスプラグインから得たコードです

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

これは、複雑な文字列をフォーマットするための本当に便利なテクニックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.