{ }
PHP'de string değişmezlerinde (kıvırcık parantez) anlamı nedir ?
{ }
PHP'de string değişmezlerinde (kıvırcık parantez) anlamı nedir ?
Yanıtlar:
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";
$vars='x:3,y:9'; $json="{{$vars}}";
. QiGuang'ın makalesine teşekkürler .
$out = '$aefgh'
; (kelimenin tam anlamıyla $ aefgh'e ihtiyacınız varsa)
SimpleXMLElement
: {}
düğümün kendisine erişmek için kullanılır, ör $element[0]->{0}
. "0" özelliği bulunamadığından, bu __get
/ __set
metodu tetikleyecektir . Bu özünde, ArrayAccess
dizin erişimi için bir alternatif sağlar , örneğin 3v4l.org/1F254 .
$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)
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
?>
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.
evaluate
yerine kullanacağımparse
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,
);
}
}
İş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.