วงเล็บปีกกาในสตริงใน PHP


190

ความหมายของ{ }(วงเล็บปีกกา) ในตัวอักษรสตริงใน PHP คืออะไร?



@ Quasimodo'sclone นั่นเป็นคำถามที่แตกต่างกันโดยสิ้นเชิงและไม่ควรได้รับการพิจารณาซ้ำ
Douwe de Haan

คำตอบ:


281

นี่คือไวยากรณ์ที่ซับซ้อน (หยิก)สำหรับการแก้ไขสตริง จากคู่มือ:

ไวยากรณ์คอมเพล็กซ์ (หยิก)

สิ่งนี้ไม่ได้เรียกว่าซับซ้อนเนื่องจากไวยากรณ์มีความซับซ้อน แต่เป็นเพราะมันอนุญาตให้ใช้การแสดงออกที่ซับซ้อนได้

ตัวแปรสเกลาร์องค์ประกอบอาร์เรย์หรือคุณสมบัติวัตถุใด ๆ ที่มีการแทนสตริงสามารถรวมผ่านไวยากรณ์นี้ เพียงแค่เขียนแสดงออกลักษณะเดียวกับที่มันก็จะปรากฏนอกสตริงแล้วห่อมันในและ{ }เนื่องจาก{ไม่สามารถหนีรูปแบบนี้จะได้รับการยอมรับเมื่อต่อไปทันที$ {ใช้ เพื่อให้ได้ตัวอักษร{\$ {$ตัวอย่างบางส่วนเพื่อให้ชัดเจน:

<?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";

40
nitpicking ทางทวารหนักมากเกินไปเกี่ยวกับการคัดลอก / วาง ถ้ามันทำให้ง่ายต่อการเข้าใจ / ค้นหานั่นเป็นการตัดสินใจที่ดี +1 จากฉันมันเป็นสิ่งที่ฉันกำลังมองหาและฉันไม่พบมันในคู่มือ PHP - อาจเป็นเพราะพวกเขาเรียกมันด้วยชื่อที่เหมาะสมหรืออะไรก็ตาม แต่ฉันพบที่นี่
Gabriel Magana

9
สำหรับ curlies $vars='x:3,y:9'; $json="{{$vars}}";อักษรสองเท่าของพวกเขาขึ้นเช่น ต้องขอขอบคุณบทความ QiGuang ของ
Bob Stein

... หรือ$out = '$aefgh'; (ถ้าคุณต้องการ $ aefgh แท้จริง)
Roko C. Buljan

ตัวอย่างเช่นกรณีใช้ที่น่าสนใจคือSimpleXMLElement: ใช้ในการเข้าถึงโหนดตัวเองเช่น{} $element[0]->{0}เนื่องจากคุณสมบัติ "0" ไม่มีอยู่สิ่งนี้จะทริกเกอร์__get/ __setเมธอด นี้ในสาระสำคัญช่วยให้คุณทางเลือกให้กับArrayAccessสำหรับการเข้าถึงดัชนีเช่น3v4l.org/1F254
Gajus

2
หากเนื้อหาภายในวงเล็บปีกกาตัวอักษรมีตัวแปรด้วยให้เพิ่มเครื่องหมายปีกกาลงในตัวแปรทุกตัว: $min=1;$max=5; echo ".{{$min},{$max}}"ผลตอบแทน.{1,5}(ฉันมีปัญหาในการรู้ว่าจะ "ทวีคูณ [วงเล็บปีกกาคู่] ขึ้นไป" ระบุไว้ในข้อคิดเห็นของ @ BobStein)
Xenos

47

สำหรับฉันแล้วเครื่องมือจัดฟันแบบหยิกนั้นทำหน้าที่แทนการต่อกันมันเร็วกว่าในการพิมพ์และโค้ดดูสะอาดตา อย่าลืมใช้เครื่องหมายคำพูดคู่ ("") เนื่องจากเนื้อหาของมันถูกวิเคราะห์โดย 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

?>

1
"เนื้อหาของพวกเขาถูกวิเคราะห์โดย PHP" - สิ่งนี้ทำให้เข้าใจผิด คุณไม่สามารถใส่การแสดงออกของ PHP โดยพลการไว้ในไวยากรณ์ของคำสั่งแบบหยิกซึ่งเป็นสิ่งที่ฉันอ่านคำพูดของคุณที่จะหมายถึง
Mark Amery

1
IMO โดยรวมจะไม่เร็วกว่าในการพิมพ์ด้วยวงเล็บ คุณต้องSHIFTกดปุ่มสำหรับเครื่องหมายคำพูดคู่และสำหรับวงเล็บปีกกา มันจะเร็วกว่า แต่ถ้าคุณใช้เครื่องหมายคำพูดคู่อย่างเคร่งครัด
deflime

2
ขอขอบคุณที่เน้นการเสนอราคาสองครั้งพร้อมการเสนอราคาเดี่ยว +1
cameronjonesweb

ฉันจะใช้evaluateแทนparse
Cholthi Paul Ttiopic

17

ตัวอย่าง:

$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";

หากไม่มีเครื่องหมายปีกกา PHP จะพยายามค้นหาตัวแปรที่มีชื่อ$numberthซึ่งไม่มีอยู่จริง!


3

ฉันยังพบว่ามันมีประโยชน์ในการเข้าถึงคุณลักษณะของวัตถุที่ชื่อแอตทริบิวต์แตกต่างกันไปตามตัววนซ้ำ ตัวอย่างเช่นฉันใช้รูปแบบด้านล่างสำหรับชุดของช่วงเวลา: ชั่วโมง, วัน, เดือน

$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,
        );
    }
}

-5

นี่คือรหัสที่ฉันได้รับจากปลั๊กอิน wordpress หนึ่งอัน

$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");

นี่เป็นเทคนิคที่มีประโยชน์มากสำหรับการจัดรูปแบบสตริงที่ซับซ้อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.