ความหมายของ{ }
(วงเล็บปีกกา) ในตัวอักษรสตริงใน 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";
$vars='x:3,y:9'; $json="{{$vars}}";
อักษรสองเท่าของพวกเขาขึ้นเช่น ต้องขอขอบคุณบทความ QiGuang ของ
$out = '$aefgh'
; (ถ้าคุณต้องการ $ aefgh แท้จริง)
SimpleXMLElement
: ใช้ในการเข้าถึงโหนดตัวเองเช่น{}
$element[0]->{0}
เนื่องจากคุณสมบัติ "0" ไม่มีอยู่สิ่งนี้จะทริกเกอร์__get
/ __set
เมธอด นี้ในสาระสำคัญช่วยให้คุณทางเลือกให้กับArrayAccess
สำหรับการเข้าถึงดัชนีเช่น3v4l.org/1F254
$min=1;$max=5; echo ".{{$min},{$max}}"
ผลตอบแทน.{1,5}
(ฉันมีปัญหาในการรู้ว่าจะ "ทวีคูณ [วงเล็บปีกกาคู่] ขึ้นไป" ระบุไว้ในข้อคิดเห็นของ @ BobStein)
สำหรับฉันแล้วเครื่องมือจัดฟันแบบหยิกนั้นทำหน้าที่แทนการต่อกันมันเร็วกว่าในการพิมพ์และโค้ดดูสะอาดตา อย่าลืมใช้เครื่องหมายคำพูดคู่ ("") เนื่องจากเนื้อหาของมันถูกวิเคราะห์โดย 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
ตัวอย่าง:
$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";
หากไม่มีเครื่องหมายปีกกา PHP จะพยายามค้นหาตัวแปรที่มีชื่อ$numberth
ซึ่งไม่มีอยู่จริง!
ฉันยังพบว่ามันมีประโยชน์ในการเข้าถึงคุณลักษณะของวัตถุที่ชื่อแอตทริบิวต์แตกต่างกันไปตามตัววนซ้ำ ตัวอย่างเช่นฉันใช้รูปแบบด้านล่างสำหรับชุดของช่วงเวลา: ชั่วโมง, วัน, เดือน
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
รูปแบบเดียวกันนี้ยังสามารถใช้เพื่อเข้าถึงวิธีการเรียน เพียงสร้างชื่อเมธอดในลักษณะเดียวกันโดยใช้สตริงและตัวแปรสตริง
คุณสามารถโต้แย้งได้อย่างง่ายดายเพียงแค่ใช้อาร์เรย์สำหรับการจัดเก็บค่าตามระยะเวลา หากแอปพลิเคชันนี้เป็น PHP เท่านั้นฉันจะยอมรับ ฉันใช้รูปแบบนี้เมื่อแอตทริบิวต์ class จับคู่กับเขตข้อมูลในตารางฐานข้อมูล แม้ว่ามันจะเป็นไปได้ที่จะเก็บอาร์เรย์ในฐานข้อมูลโดยใช้การทำให้เป็นอนุกรม แต่ก็ไม่มีประสิทธิภาพและไม่มีจุดหมายหากแต่ละฟิลด์จะต้องทำดัชนี ฉันมักจะเพิ่มชื่อฟิลด์ที่เรียงลำดับโดยตัววนซ้ำเพื่อสิ่งที่ดีที่สุดของโลกทั้งสอง
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,
);
}
}
นี่คือรหัสที่ฉันได้รับจากปลั๊กอิน wordpress หนึ่งอัน
$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");
นี่เป็นเทคนิคที่มีประโยชน์มากสำหรับการจัดรูปแบบสตริงที่ซับซ้อน