Cú pháp ngoặc nhọn PHP cho biến thành viên


79

Câu hỏi đầu tiên về SO và đó là một ứng cử viên RTM thực sự. Nhưng tôi hứa với bạn rằng tôi đã tìm và dường như không thể tìm thấy nó. Tôi sẽ rất vui khi thực hiện một #headpalm khi nó hóa ra là một việc đơn giản mà tôi đã bỏ lỡ.

Cố gắng tìm ra Zend Framework và bắt gặp cú pháp sau:

$this->_session->{'user_id'}

Tôi chưa bao giờ thấy cú pháp dấu ngoặc nhọn được sử dụng để truy cập những gì dường như là một biến thành viên. Nó khác với

$this->_session->user_id

Tôi giả định rằng _session là không liên quan, nhưng hãy đưa nó vào câu hỏi vì nó có thể không.

Có phải các dấu ngoặc nhọn chỉ là một quy ước về độ sạch để cố gắng bọc tên biến phức hợp user_id không? Hay nó là một loại công cụ truy cập đặc biệt?

Bất kỳ điểm nhấn nào vào TFM để tôi có thể R sẽ được đánh giá cao.

Cảm ơn nhiều. Làm ơn dịu dàng.


7
Cảm ơn tất cả, vì những câu trả lời nhanh chóng và xuất sắc. Với sự khởi đầu nhẹ nhàng này vào SO, tôi được khuyến khích sử dụng nó nhiều hơn. Hy vọng rằng, tôi có thể giúp trả lời các câu hỏi, không chỉ hỏi họ. Chúc mừng.
David Weinraub,

1
Tidbit thú vị: Bạn có thể gọi các phương thức với cú pháp xoăn, và kết quả nhanh như gọi phương thức trực tiếp. Sử dụng call_user_func tổng quát hơn, nhưng phải mất gấp đôi thời gian để thực hiện call_user_func (array ($ obj, $ method), "parm1", "parm2") thay vì $ obj -> {$ method} ("parm1," parm2 " );
Rolf

Và phần sau cũng dễ đọc hơn. Ít nhất là IMO. Thực ra, tôi thường bỏ qua các dấu ngoặc nhọn vào tên phương pháp trong trường hợp đó:$obj->$method($params)
David Weinraub

Câu trả lời:


51

Dấu ngoặc nhọn được sử dụng để chỉ định rõ ràng phần cuối của tên biến. Ví dụ:

echo "This square is {$square->width}00 centimeters broad."; 

Như vậy, trường hợp của bạn thực sự là tổng hợp của hai trường hợp đặc biệt. Bạn được phép truy cập các biến lớp bằng cách sử dụng dấu ngoặc nhọn và như vậy:

$class->{'variable_name'} // Same as $class->variable_name
$class->{'variable' . '_name'} // Dynamic values are also allowed

Và trong trường hợp của bạn, bạn chỉ bao quanh chúng bằng cú pháp ngoặc nhọn.

Xem hướng dẫn sử dụng PHP , "cú pháp phức tạp (xoăn)."


2
Đây không phải là trường hợp mà $ this -> _ session -> {'user_id'} đang được sử dụng.
jimyi

Cảm ơn đã trả lời nhanh chóng. Vâng, tôi sẽ lấy cái mũ bảo hiểm. Tôi đã sử dụng cú pháp trong các trường hợp khác, chỉ là không nhận ra nó trong ngữ cảnh của các biến thành viên. Tệ hơn nữa, khi tìm kiếm, tôi đã tìm thấy trang đó trong sách hướng dẫn, nhưng không thấy mẫu biến thành viên. Thở dài ... Tuy nhiên, ví dụ tôi đưa ra là một trường hợp kỳ quặc để sử dụng nó, phải không? Không có sự mơ hồ thực sự, không cần phân định thực tế. Chắc chắn về mặt cú pháp hợp lệ, nhưng loại sử dụng không cần thiết. Hiểu ý tôi chứ?
David Weinraub,

2
@jimyi, tôi đã làm rõ thêm câu trả lời của mình. Cảm ơn. @papayasoft, tôi đồng ý rằng nó khá không cần thiết trong trường hợp của bạn. Tôi đoán rằng đó là mã được tạo tự động và họ sử dụng cú pháp xoăn phức tạp chỉ để bao gồm tất cả các cơ sở.
James Skidmore

24

Tôi chỉ biết cú pháp khi sử dụng các biến biến :

$userProp = 'id';
$this->_session->{'user_'.$userProp};

1
+1 cho câu trả lời duy nhất có liên kết thích hợp tới TFM, như @jimyi gợi ý. OP không phải là về cú pháp phức tạp (xoăn) cho chuỗi. Đó là về việc sử dụng dấu ngoặc nhọn để giải quyết sự không rõ ràng trong các biến biến.
Bob Stein

19

Tuy nhiên, có lẽ một trong những lợi thế lớn của cú pháp đó, nói chung là trong lĩnh vực lông bông và những điều bạn có thể muốn tránh.

Nó cho phép bạn sử dụng các ký tự trong tên biến không được phép.

I E:

$this->object->{"hello world\0\n"} 
$this->object->{"function(){   this is a truely awful  name for a variable }"} 

6
Tuy nhiên, nó không cần phải cực đoan như các ví dụ của bạn. Ví dụ, bạn có thể tưởng tượng có dữ liệu phiên lưu trữ trong một cơ sở dữ liệu, và một cột tên là "user-id" thay vì "user_id" ...
Mercator

2
Ngoài ra, trên các phiên bản PHP cũ hơn, việc đặt \ 0 ở đầu chuỗi ISTR cho phép bạn truy cập vào các biến bản sao. Bây giờ, ít nhất \ 0 cung cấp cho bạn một ngoại lệ nghiêm trọng "bạn không thể làm điều đó xin lỗi".
Kent Fredric,

12

Trong ví dụ bạn đưa ra, không có sự khác biệt thực sự và IMO $this->_session->user_idnên được sử dụng vì nó rõ ràng hơn.

Cú pháp ngoặc nhọn thực sự tốt là truy cập một biến thành viên bằng cách xây dựng một biểu thức cho tên của nó, chẳng hạn như $this->_session->{'user_id' . $index}.


11

Hai ví dụ trong câu hỏi của bạn làm điều tương tự. PHP cho phép bạn truy cập dữ liệu / phương thức thành viên theo một số cách ...

object->{'name_of_member'};

object->name_of_member;

$member = 'name_of_member';
object->$member;
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.