2009-07-18 35 views
76

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 tôi đã nhìn và dường như không thể tìm thấy nó. Tôi sẽ vui vẻ làm một #headpalm khi nó trở thành một điều đơn giản mà tôi đã bỏ lỡ.Cú pháp cú pháp ngoặc nhọn PHP cho biến thành viên

Đang cố gắng để tìm ra Zend Framework và đi qua các cú pháp sau:

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

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

$this->_session->user_id 

Tôi giả định rằng _session không liên quan, nhưng kể cả câu hỏi trong câu hỏi vì nó có thể không có.

Dấu ngoặc nhọn chỉ là quy ước sạch sẽ cố gắng bọc tên biến hợp chất user_id? Hay đó là một loại người truy cập đặc biệt?

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

Rất cám ơn. Làm ơn dịu dàng.

+7

Cảm ơn tất cả, vì câu trả lời nhanh và tuyệt vời. 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. –

+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 là tổng quát hơn, nhưng phải mất gấp đôi thời gian để gọi call_user_func (mảng ($ obj, $ method), "parm1", "parm2") thay vì $ obj -> {$ method} ("parm1," parm2 " – Rolf

+0

Và sau này cũng dễ đọc hơn, ít nhất là IMO Trên thực tế, tôi thường bỏ qua các dấu ngoặc nhọn trên tên phương thức trong trường hợp đó: '$ obj -> $ method ($ params)' –

Trả lời

46

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

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

Vì vậy, trường hợp của bạn thực sự là sự kết 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ỉ cần xung quanh chúng với cú pháp cú đúp xoăn.

Xem cú pháp phức tạp (quăn) PHP manual. "

+2

Đây không phải là tình huống trong đó $ this -> _ session -> {'user_id'} đang được sử dụng. – jimyi

+0

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

+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 điều này là không cần thiết trong trường hợp của bạn. Tôi đoán là nó là mã được tạo tự động và họ sử dụng cú pháp xoăn phức tạp chỉ để trang trải tất cả các căn cứ. –

22

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

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

+1 cho câu trả lời duy nhất có liên kết phù hợp với TFM, như @jimyi ám chỉ. O.P. 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ự mơ hồ trong các biến biến. –

9

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 của thành viên theo một số cách ...

object->{'name_of_member'}; 

object->name_of_member; 

$member = 'name_of_member'; 
object->$member; 
19

Có lẽ một lợi thế lớn của cú pháp đó, tuy nhiên, nó thường nằm trong miền của công cụ lông và những thứ bạn có thể muốn tránh.

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

ví dụ:

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

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

+2

Ngoài ra, trên các phiên bản cũ hơn của PHP đặt \ 0 ở phía trước của chuỗi ISTR cho phép bạn truy cập các biến pivate. Bây giờ ít nhất \ 0 cho bạn một "bạn không thể làm điều đó xin lỗi" ngoại lệ chết người. –

+5

+1 cho tên biến số gây ra cơn ác mộng kinh khủng và hết sức kinh khủng. Dù sao tôi cũng không định ngủ ... –

11

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

Cú pháp cú đúp xoăn thực sự tốt cho việc truy cập 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ó, như $this->_session->{'user_id' . $index}.