Niềng răng xoăn trong chuỗi trong PHP


Câu trả lời:


281

Đây là cú pháp phức tạp (xoăn) cho phép nội suy chuỗi. Từ hướng dẫn:

Cú pháp phức tạp (xoăn)

Điều này không được gọi là phức tạp vì cú pháp phức tạp, nhưng vì nó cho phép sử dụng các biểu thức phức tạp.

Bất kỳ biến vô hướng, phần tử mảng hoặc thuộc tính đối tượng có biểu diễn chuỗi có thể được bao gồm thông qua cú pháp này. Đơn giản chỉ cần viết biểu thức theo cách tương tự như nó sẽ xuất hiện bên ngoài chuỗi, sau đó gói nó vào {}. Vì {không thể thoát được, cú pháp này sẽ chỉ được nhận ra khi $ngay lập tức theo sau {. Sử dụng {\$để có được một nghĩa đen {$. Một số ví dụ để làm rõ:

<?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()}";
?>

Thông thường, cú pháp này là không cần thiết. Ví dụ: cái này:

$a = 'abcd';
$out = "$a $a"; // "abcd abcd";

hành xử giống hệt như thế này:

$out = "{$a} {$a}"; // same

Vì vậy, các dấu ngoặc nhọn là không cần thiết. Nhưng điều này :

$out = "$aefgh";

tùy thuộc vào mức độ lỗi của bạn, sẽ không hoạt động hoặc tạo ra lỗi vì không có biến được đặt tên $aefgh, vì vậy bạn cần phải làm:

$out = "${a}efgh"; // or
$out = "{$a}efgh";

40
quá nhiều nitpicking hậu môn về sao chép / dán. Nếu nó làm cho nó dễ hiểu / tìm thấy, thì đó là một quyết định tốt. +1 từ tôi, đó chính xác là những gì tôi đang tìm kiếm và tôi không tìm thấy nó trong hướng dẫn sử dụng PHP - có thể vì họ gọi nó bằng tên riêng hoặc bất cứ điều gì. Nhưng tôi đã tìm thấy nó ở đây.
Gabriel Magana

9
Đối với curlies theo nghĩa đen, tăng gấp đôi chúng, ví dụ $vars='x:3,y:9'; $json="{{$vars}}";. Cảm ơn bài viết của QiGuang .
Bob Stein

... Hoặc $out = '$aefgh'; (nếu bạn cần $ aefgh theo nghĩa đen)
Roko C. Buljan

Ví dụ trường hợp sử dụng thú vị là SimpleXMLElement: {}được sử dụng để truy cập vào nút, ví dụ $element[0]->{0}. Vì thuộc tính "0" không thể tồn tại, nên điều này sẽ kích hoạt __get/ __setphương thức. Về bản chất, điều này cho phép bạn thay thế ArrayAccesscho truy cập chỉ mục, ví dụ 3v4l.org/1F254 .
Gajus

2
Nếu một nội dung bên trong dấu ngoặc nhọn theo nghĩa đen cũng chứa các biến, thì hãy thêm dấu ngoặc nhọn vào mỗi biến: $min=1;$max=5; echo ".{{$min},{$max}}"năng suất .{1,5}(tôi gặp khó khăn khi biết cách "nhân đôi [dấu ngoặc nhọn] lên" được đề cập trong bình luận của @ BobStein)
Xenos

46

Đối với tôi, niềng răng xoăn phục vụ như là một thay thế cho nối, chúng nhanh hơn để gõ và mã trông sạch hơn. Hãy nhớ sử dụng dấu ngoặc kép ("") vì nội dung của chúng được phân tích cú pháp bởi PHP, bởi vì trong dấu ngoặc đơn ('') bạn sẽ nhận được tên bằng chữ của biến được cung cấp:

<?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
"Nội dung của chúng được phân tích cú pháp bởi PHP" - Điều này gây hiểu nhầm. Bạn không thể đặt các biểu thức PHP tùy ý bên trong cú pháp dấu ngoặc nhọn, đó là ý nghĩa của việc tôi đọc trích dẫn của bạn.
Đánh dấu Amery

1
IMO, về tổng thể, không nhanh hơn khi nhập bằng dấu ngoặc. Bạn phải SHIFTnhấn phím cho dấu ngoặc kép và dấu ngoặc nhọn. Nó sẽ nhanh hơn mặc dù nếu bạn nghiêm túc sử dụng dấu ngoặc kép.
chệch hướng

2
Cảm ơn bạn đã làm nổi bật dấu ngoặc kép v trích dẫn đơn, +1
cameronjonesweb

Tôi sẽ sử dụng evaluatethay vìparse
Cholthi Paul Ttiopic

17

Thí dụ:

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

Nếu không có dấu ngoặc nhọn, PHP sẽ cố gắng tìm một biến có tên $numberth, điều đó không tồn tại!


3

Tôi cũng thấy hữu ích khi truy cập các thuộc tính đối tượng trong đó tên thuộc tính thay đổi theo một số trình vòng lặp. Ví dụ: tôi đã sử dụng mẫu bên dưới cho một khoảng thời gian: giờ, ngày, tháng.

$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
    $this->{'value_'.$period}=1;
}

Mẫu tương tự này cũng có thể được sử dụng để truy cập các phương thức lớp. Chỉ cần xây dựng tên phương thức theo cách tương tự, sử dụng các chuỗi và biến chuỗi.

Bạn có thể dễ dàng tranh luận chỉ sử dụng một mảng để lưu trữ giá trị theo thời gian. Nếu ứng dụng này chỉ là PHP, tôi sẽ đồng ý. Tôi sử dụng mẫu này khi lớp thuộc tính ánh xạ tới các trường trong bảng cơ sở dữ liệu. Mặc dù có thể lưu trữ các mảng trong cơ sở dữ liệu bằng cách sử dụng tuần tự hóa, nhưng nó không hiệu quả và vô nghĩa nếu các trường riêng lẻ phải được lập chỉ mục. Tôi thường thêm một mảng các tên trường, được khóa bởi iterator, cho tốt nhất của cả hai thế giới.

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

Đây là mã tôi nhận được từ một plugin wordpress

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

Đây thực sự là kỹ thuật tiện dụng để định dạng các chuỗi phức tạp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.