Ini tidak disebut kompleks karena sintaksisnya kompleks, tetapi karena memungkinkan penggunaan ekspresi kompleks.
Setiap variabel skalar, elemen array, atau properti objek dengan representasi string dapat dimasukkan melalui sintaks ini. Cukup tulis ekspresi dengan cara yang sama seperti yang akan muncul di luar string, lalu bungkus dalam {dan }. Karena {tidak dapat melarikan diri, sintaks ini hanya akan dikenali ketika $langsung mengikuti {. Gunakan
{\$untuk mendapatkan literal {$. Beberapa contoh untuk memperjelas:
<?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()}";?>
Seringkali, sintaks ini tidak perlu. Sebagai contoh, ini:
$a ='abcd';
$out ="$a $a";// "abcd abcd";
berperilaku persis sama dengan ini:
$out ="{$a} {$a}";// same
Jadi kurung kurawal tidak perlu. Tapi ini :
$out ="$aefgh";
akan, tergantung pada tingkat kesalahan Anda, tidak berfungsi atau menghasilkan kesalahan karena tidak ada variabel bernama $aefgh, jadi yang perlu Anda lakukan:
terlalu banyak anal nitpicking tentang copy / paste. Jika itu membuatnya mudah dimengerti / ditemukan, maka itu adalah keputusan yang baik. +1 dari saya, itu persis apa yang saya cari, dan saya tidak menemukannya di manual PHP - mungkin karena mereka menyebutnya dengan nama yang tepat, atau apa pun. Tapi saya menemukannya di sini.
Gabriel Magana
9
Untuk ikal harfiah, gandakan, misalnya $vars='x:3,y:9'; $json="{{$vars}}";. Terima kasih untuk artikel QiGuang .
Bob Stein
... Atau $out = '$aefgh'; (jika Anda membutuhkan $ aefgh)
Roko C. Buljan
Contoh use case yang menarik adalah SimpleXMLElement: {}digunakan untuk mengakses node itu sendiri, misalnya $element[0]->{0}. Karena properti "0" tidak ada, ini akan memicu __get/ __setmetode. Ini pada dasarnya memungkinkan Anda alternatif ArrayAccessuntuk akses indeks, misalnya 3v4l.org/1F254 .
Gajus
2
Jika suatu konten di dalam kurung kurawal literal mengandung variabel juga, maka tambahkan kurung kurawal ke setiap variabel: $min=1;$max=5; echo ".{{$min},{$max}}"hasil .{1,5}(saya mengalami kesulitan mengetahui di mana "menggandakan [kurung kurawal] naik" disebutkan dalam komentar @ BobStein)
Xenos
47
Bagi saya, kurung kurawal berfungsi sebagai pengganti untuk rangkaian, mereka lebih cepat untuk mengetik dan kode terlihat lebih bersih. Ingatlah untuk menggunakan tanda kutip ganda ("") karena isinya diurai oleh PHP, karena dalam tanda kutip tunggal ('') Anda akan mendapatkan nama literal variabel yang disediakan:
<?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?>
"konten mereka diurai oleh PHP" - Ini menyesatkan. Anda tidak bisa begitu saja menempatkan ekspresi PHP yang sewenang-wenang di dalam sintaks kurung kurawal, itulah yang saya baca artinya.
Mark Amery
1
IMO, secara keseluruhan, tidak cepat untuk mengetik dengan tanda kurung. Anda harus SHIFTmenekan tombol untuk tanda kutip ganda dan untuk kurung keriting. Akan lebih cepat jika Anda secara ketat menggunakan tanda kutip ganda.
luhur
2
Terima kasih telah menyoroti tanda kutip ganda v tanda kutip tunggal, +1
cameronjonesweb
Saya akan menggunakan evaluatesebagai gantiparse
Cholthi Paul Ttiopic
17
Contoh:
$number =4;print"You have the {$number}th edition book";//output: "You have the 4th edition book";
Tanpa kurung kurawal PHP akan mencoba mencari variabel bernama $numberth, itu tidak ada!
Saya juga menemukan itu berguna untuk mengakses atribut objek di mana nama atribut bervariasi oleh beberapa iterator. Sebagai contoh, saya telah menggunakan pola di bawah ini untuk serangkaian periode waktu: jam, hari, bulan.
$periods=array('hour','day','month');foreach($periods as $period){
$this->{'value_'.$period}=1;}
Pola yang sama ini juga dapat digunakan untuk mengakses metode kelas. Hanya membangun nama metode dengan cara yang sama, menggunakan variabel string dan string.
Anda bisa dengan mudah berdebat hanya menggunakan array untuk penyimpanan nilai berdasarkan titik. Jika aplikasi ini hanya PHP, saya setuju. Saya menggunakan pola ini ketika atribut atribut peta ke bidang dalam tabel database. Meskipun dimungkinkan untuk menyimpan array dalam database menggunakan serialisasi, itu tidak efisien, dan tidak ada gunanya jika masing-masing bidang harus diindeks. Saya sering menambahkan array nama bidang, dikunci oleh iterator, untuk yang terbaik dari kedua dunia.
class timevalues{// Database table values:public $value_hour;// maps to values.value_hourpublic $value_day;// maps to values.value_daypublic $value_month;// maps to values.value_monthpublic $values=array();publicfunction __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,);}}
Jawaban:
Ini adalah sintaksis kompleks (keriting) untuk interpolasi string. Dari manual:
Seringkali, sintaks ini tidak perlu. Sebagai contoh, ini:
berperilaku persis sama dengan ini:
Jadi kurung kurawal tidak perlu. Tapi ini :
akan, tergantung pada tingkat kesalahan Anda, tidak berfungsi atau menghasilkan kesalahan karena tidak ada variabel bernama
$aefgh
, jadi yang perlu Anda lakukan:sumber
$vars='x:3,y:9'; $json="{{$vars}}";
. Terima kasih untuk artikel QiGuang .$out = '$aefgh'
; (jika Anda membutuhkan $ aefgh)SimpleXMLElement
:{}
digunakan untuk mengakses node itu sendiri, misalnya$element[0]->{0}
. Karena properti "0" tidak ada, ini akan memicu__get
/__set
metode. Ini pada dasarnya memungkinkan Anda alternatifArrayAccess
untuk akses indeks, misalnya 3v4l.org/1F254 .$min=1;$max=5; echo ".{{$min},{$max}}"
hasil.{1,5}
(saya mengalami kesulitan mengetahui di mana "menggandakan [kurung kurawal] naik" disebutkan dalam komentar @ BobStein)Bagi saya, kurung kurawal berfungsi sebagai pengganti untuk rangkaian, mereka lebih cepat untuk mengetik dan kode terlihat lebih bersih. Ingatlah untuk menggunakan tanda kutip ganda ("") karena isinya diurai oleh PHP, karena dalam tanda kutip tunggal ('') Anda akan mendapatkan nama literal variabel yang disediakan:
sumber
SHIFT
menekan tombol untuk tanda kutip ganda dan untuk kurung keriting. Akan lebih cepat jika Anda secara ketat menggunakan tanda kutip ganda.evaluate
sebagai gantiparse
Contoh:
Tanpa kurung kurawal PHP akan mencoba mencari variabel bernama
$numberth
, itu tidak ada!sumber
Saya juga menemukan itu berguna untuk mengakses atribut objek di mana nama atribut bervariasi oleh beberapa iterator. Sebagai contoh, saya telah menggunakan pola di bawah ini untuk serangkaian periode waktu: jam, hari, bulan.
Pola yang sama ini juga dapat digunakan untuk mengakses metode kelas. Hanya membangun nama metode dengan cara yang sama, menggunakan variabel string dan string.
Anda bisa dengan mudah berdebat hanya menggunakan array untuk penyimpanan nilai berdasarkan titik. Jika aplikasi ini hanya PHP, saya setuju. Saya menggunakan pola ini ketika atribut atribut peta ke bidang dalam tabel database. Meskipun dimungkinkan untuk menyimpan array dalam database menggunakan serialisasi, itu tidak efisien, dan tidak ada gunanya jika masing-masing bidang harus diindeks. Saya sering menambahkan array nama bidang, dikunci oleh iterator, untuk yang terbaik dari kedua dunia.
sumber
di sini adalah kode yang saya dapatkan dari satu plugin wordpress
Ini adalah teknik yang sangat berguna untuk memformat string kompleks.
sumber