{ }
PHPの文字列リテラルにおける(中括弧)の意味は何ですか?
{ }
PHPの文字列リテラルにおける(中括弧)の意味は何ですか?
回答:
これは、文字列補間の複雑な(カーリー)構文です。マニュアルから:
複雑な(カーリー)構文
構文は複雑なので、これは複雑とは呼ばれませんが、複雑な式を使用できるためです。
この構文を使用して、文字列表現を持つスカラー変数、配列要素、またはオブジェクトプロパティを含めることができます。それは文字列の外側に現れる同様に式を書き、その後でそれをラップ
{
して}
。以来{
エスケープすることができないとき、この構文にのみ認識されます$
、すぐに次の{
。{\$
リテラルを取得するために使用 します{$
。それを明確にするいくつかの例:<?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";
$out = '$aefgh'
; (文字通り$ aefghが必要な場合)
SimpleXMLElement
:{}
例えば、ノード自体にアクセスするために使用されます$element[0]->{0}
。プロパティ「0」は存在できないため、これにより__get
/ __set
メソッドがトリガーされます。これにより、本質的にはArrayAccess
、インデックスアクセスの代替手段、たとえば3v4l.org/1F254が可能になります。
$min=1;$max=5; echo ".{{$min},{$max}}"
利回り.{1,5}
(私はトラブルがBobSteinさんのコメント@にmentionned「[中括弧]ダブルアップ」に知っていた)
私にとっては、中かっこは連結の代わりとして機能します。中かっこは入力が速く、コードがよりきれいに見えます。コンテンツは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
?>
SHIFT
二重引用符のためにと、中括弧のためにキーを押します。ただし、二重引用符を厳密に使用すると、より速くなります。
evaluate
代わりに使用しますparse
また、属性名がイテレータによって異なるオブジェクト属性にアクセスすることも便利です。たとえば、以下のパターンを一連の期間(時間、日、月)に使用しました。
$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,
);
}
}
これは私が1つのワードプレスプラグインから得たコードです
$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");
これは、複雑な文字列をフォーマットするための本当に便利なテクニックです。