Ý nghĩa của { }
(dấu ngoặc nhọn) trong chuỗi ký tự trong PHP là gì?
Ý nghĩa của { }
(dấu ngoặc nhọn) trong chuỗi ký tự trong PHP là gì?
Câu trả lời:
Đâ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à}
. 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";
$vars='x:3,y:9'; $json="{{$vars}}";
. Cảm ơn bài viết của QiGuang .
$out = '$aefgh'
; (nếu bạn cần $ aefgh theo nghĩa đen)
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
/ __set
phương thức. Về bản chất, điều này cho phép bạn thay thế ArrayAccess
cho truy cập chỉ mục, ví dụ 3v4l.org/1F254 .
$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)
Đố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
?>
SHIFT
nhấ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.
evaluate
thay vìparse
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,
);
}
}
Đâ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.