2012-01-29 16 views
14

私はOpenCartのソースを読んでいましたが、私は以下のような式に遭遇しました。誰かが私にそれを説明することができます:PHPの中括弧記法

$quote = $this->{'model_shipping_' . $result['code']}->getQuote($shipping_address); 

声明の中で、{}を持っていると私はそれが何であるか疑問に思う
$this->{'model_shipping_' . $result['code']}
ある奇妙なコード部分はありますか?それは私には見えますが、私は本当に分かりません。

答えて

23

中括弧は、PHPの文字列または変数補間を示すために使用されます。これは、あなたが実際に何を実際に知っていることなく関数を呼び出すことができるようにすることができます '可変関数'を作成することができます。これを使用する

、あなたはほとんどあなたのようなオブジェクトのプロパティを作成することができますでしょう配列:

$property_name = 'foo'; 
$object->{$property_name} = 'bar'; 
// same as $object->foo = 'bar'; 

それとも、RESTのAPIクラスのいくつかの並べ替えを持っている場合は、メソッドのセットのいずれかを呼び出すことができます。

$allowed_methods = ('get', 'post', 'put', 'delete'); 
$method = strtolower($_SERVER['REQUEST_METHOD']); // eg, 'POST' 

if (in_array($method, $allowed_methods)) { 
    return $this->{$method}(); 
    // return $this->post(); 
} 

したい場合はまた、より簡単に補間を識別するための文字列で使われていた:

$hello = 'Hello'; 
$result = "{$hello} world"; 

もちろんこれらは単純化されています。あなたのサンプルコードの目的は、$result['code']の値に応じていくつかの関数の1つを実行することです。

+1

ありがとう、私はこの説明が非常に分かりやすく広範であることを発見しました。 – Tarik

+1

最初の例では、 '$ object-> $ property_name = 'bar''と書くだけで、まったく同じ効果が得られます。中括弧は、それが非自明な式であるときに必要なだけであると思います – Cruncher

4

中括弧は、変数 の終わりを明示的に指定するために使用されます。

https://stackoverflow.com/a/1147942/680578

http://php.net/manual/en/language.types.string.php#language.types.string.parsing.complex

+3

ベアリンクの回答は答えではありません。この質問が別のものと重複していると感じる場合は、それをクロージャにフラグを立てます。それ以外の場合は、引用したリンクを詳しく説明する必要があります。 – BoltClock

+0

私は文字列の中括弧を知っていますが、私の例では中括弧は引用符で囲まれていません。 – Tarik

+0

@BoltClockありがとうございます。 – Kristian

10

プロパティの名前を言って、$result['code']'abc'である二つの文字列

から実行時に計算され、アクセスプロパティが

$this->model_shipping_abc 

あろうこのプロパティまたはメソッド名にと変わった文字がある場合は、役立ちます。

そうでなければ、次の区別する方法がないだろう。

class A { 
    public $f = 'f'; 
    public $func = 'uiae'; 
} 

$a = new A(); 
echo $a->f . 'unc'; // "func" 
echo $a->{'f' . 'unc'}; // "uiae" 
+0

誰も何も言わなかったのですか?立っていたコードは、全く機能していませんでした(関数の呼び出しがありません)。関数の代わりにvarsを使うことで修正されました。 – knittl