Điều này nghe giống như một câu hỏi phỏng vấn tầm thường, chúng tôi biết. Bạn có thể dễ dàng tìm thấy một phương pháp được ghi chép đầy đủ với Reflection. Một số bậc thầy chân chính thậm chí còn cung cấp cho chúng tôi những cách không Phản chiếu khác để làm điều tương tự. Tuy nhiên, khi tự mình triển khai, bạn có thể gặp phải nhiều sự cố bất ngờ và kỳ lạ. Chúng bao gồm, nhưng không giới hạn ở
Bạn không thể làm điều đó trong một dòng đơn giản bằng cách sử dụng ReflectionBạn sẽ cần thử với đối tượng của Reflection API, nhưng đừng quên gọi setAccessible[true]
trước
ảnh chụp màn hình chính hãng từ giải pháp Stackoverflow. Tài sản riêng của bố mẹ không tính ¯\_[ツ]_/¯
Đúng rồi. nếu bạn cố gắng truy cập một thuộc tính riêng được kế thừa từ lớp cha, đoạn mã Stackoverflow được phê duyệt sẽ không thành công
Truy cập privates cha mẹ không thành công trong PHP
Tôi chắc chắn rằng có một lời giải thích học thuật, hợp lý cho hành vi này. Nếu bạn biết tại sao, hãy chia sẻ với chúng tôi trong phần bình luận. Có lẽ một cái gì đó như
Các thuộc tính riêng của các lớp cha không thể được truy cập trong thời gian chạy từ bên trong một lớp con. Do đó, chúng cũng không thể được truy cập thông qua Reflection API
Chúng ta có thể thấy một chút khác biệt trong thông báo lỗi PHP trên ảnh chụp màn hình từ 3v4l. tổ chức. thay vì “Thuộc tính p không tồn tại”, chúng ta nhận được “Thuộc tính con. $p không tồn tại”. Điều này ngụ ý rằng các thuộc tính của lớp cha thậm chí không được xem qua
Nếu bạn nghĩ về điều đó, bạn không thể truy cập tài sản riêng của cha mẹ mình khi còn nhỏ, vì vậy điều đó cũng có lý
Bỏ qua tất cả những trò đùa, làm thế nào chúng ta có thể đọc thuộc tính riêng của một đối tượng trong PHP? . phản ánh php. Hãy xem một ví dụ
Toán tử delete
được thiết kế để sử dụng trên các thuộc tính đối tượng. Nó không ảnh hưởng đến các biến hoặc chức năng
Không nên sử dụng toán tử delete
trên các thuộc tính đối tượng JavaScript được xác định trước. Nó có thể làm hỏng ứng dụng của bạn
Đối tượng lồng nhau
Các giá trị trong một đối tượng có thể là một đối tượng khác
Thí dụ
myObj = {
tên. "John",
tuổi. 30,
ô tô. {
xe1. "Ford",
xe2. "BMW",
xe3. "Fiat"
}
}
Bạn có thể truy cập các đối tượng lồng nhau bằng ký hiệu dấu chấm hoặc ký hiệu dấu ngoặc
hoặc là
hoặc là
hoặc là
Mảng và đối tượng lồng nhau
Giá trị trong đối tượng có thể là mảng và giá trị trong mảng có thể là đối tượng
Thí dụ
const myObj = {
tên. "John",
tuổi. 30,
ô tô. [
{name. "Ford", người mẫu. ["Fiesta", "Focus", "Mustang"]},
{name. "BMW", người mẫu. ["320", "X3", "X5"]},
{name. "Fiat", người mẫu. ["500", "Panda"]}
]
}
Để truy cập các mảng bên trong mảng, hãy sử dụng vòng lặp for-in cho mỗi mảng
Thí dụ
for [hãy để tôi trong myObj. ô tô] {
x += "
for [hãy đặt j trong myObj. ô tô [tôi]. models] {
x += myObj. ô tô [tôi]. models[j];
}
}Tự mình thử »
Thuộc tính tài sản
Tất cả tài sản đều có tên. Ngoài ra chúng còn có giá trị
Giá trị là một trong những thuộc tính của thuộc tính
các thuộc tính khác là. có thể đếm được, có thể định cấu hình và có thể ghi
Các thuộc tính này xác định cách truy cập thuộc tính [có thể đọc được không?, có thể ghi không?]
Trong JavaScript, tất cả các thuộc tính có thể được đọc, nhưng chỉ có thể thay đổi thuộc tính giá trị [và chỉ khi thuộc tính có thể ghi được]
[ECMAScript 5 có các phương thức để nhận và đặt tất cả các thuộc tính thuộc tính]
Thuộc tính nguyên mẫu
Các đối tượng JavaScript kế thừa các thuộc tính của nguyên mẫu của chúng
Từ khóa delete
không xóa thuộc tính kế thừa, nhưng nếu bạn xóa thuộc tính nguyên mẫu, nó sẽ ảnh hưởng đến tất cả các đối tượng được kế thừa từ nguyên mẫu
$this đề cập đến các phương thức và thuộc tính PHP của thể hiện lớp hiện tại. Nó giúp bạn truy cập nội bộ một tệp lớp. Ví dụ: bạn có thể sử dụng $this để đại diện cho các thành viên của một lớp cụ thể. Đó là biến $this tốt hơn cho đối tượng hiện tại và các thành viên không tĩnh. Nó có thể dẫn đến một lỗi nếu sử dụng nó theo cách khác
Làm thế nào để sử dụng $ này?
Hãy xem xét trường hợp đầu tiên
$nid = $row->{ $this->aliases['nid']};
Nhìn vào đoạn mã này, chúng ta có thể thấy rằng chúng ta muốn lấy giá trị $nid từ đối tượng $row. Có một vấn đề, chúng tôi không biết tên thuộc tính trên $row
Hãy xem xét một trường hợp nữa
$nid = $row->my_nid;
Đoạn mã này đơn giản hơn một chút nhưng tương tự như ví dụ trước. Tất cả là để làm gì? .
Hãy tưởng tượng rằng bạn cần truy cập thuộc tính $row->my_nid. Lập trình viên trung bình sẽ giải quyết vấn đề này như thế này. $nid = $row->my_nid;. Hoặc nó có thể được thực hiện như vậy.
$nid_property = 'my_nid';
$nid = $row->{$nid_property};
Khi sử dụng ký hiệu ->{$nid_property}, hãy đánh giá biến $nid_property và thay thế giá trị bằng tên của thuộc tính để truy cập. PHP cuối cùng sẽ hiểu điều này là $row->my_nid
Điều lớn nhất và tốt nhất ở đây là cung cấp bất kỳ logic nào cho $nid_property. Chính xác thì logic này xác định tên thuộc tính PHP sẽ là gì.
Để làm rõ tất cả những điều trên, hãy xem ví dụ.
$nid = $row->{ $this->aliases['nid']};
Giả sử bạn muốn thêm Chế độ xem mới bằng Giao diện người dùng Chế độ xem. Bạn có thể thêm cùng một trường nhiều lần nếu cần để thực hiện việc này. Hoặc, bạn có một giải pháp thay thế. Cố gắng thêm nút trường. tiêu đề và sau khi thêm nút. trường tiêu đề của các nút khác nhau được kéo bằng tham chiếu
Mô-đun Chế độ xem hoạt động theo cách như vậy. thêm một trường vào Chế độ xem sẽ tạo một tên khác và duy nhất cho từng trường và sử dụng nó trong truy vấn SQL tương ứng.
MySQL không chấp nhận việc sử dụng hai cột có tên giống nhau. Để những tên này không lặp lại, bạn cần nghĩ ra các bí danh. Bạn phải truy cập các giá trị riêng lẻ trong số đại diện PHP của hàng được trả về từ MySQL.
Lượt xem không tạo ra điều này, nhưng nhóm phát triển Drupal 8 của chúng tôi sẽ sử dụng nó để chỉ ra cách giải quyết các loại vấn đề này. Một lần nữa, ít lời hơn, nhiều hành động hơn. Hãy minh họa mọi thứ bằng một ví dụ
CHỌN node1. nid AS node_1_nid, node2. nid NHƯ node_2_nid TỪ nút node1 LEFT JOIN node node2 ON node2.nid = node1. some_other_field ;
Lượt xem sẽ thực hiện truy vấn của bạn và kết quả sẽ được lưu trữ trong biến $row. Hãy nhớ rằng tất cả các thuộc tính sẽ bằng với các bí danh được sử dụng trong truy vấn mà chúng ta đã nói trước đó. Vì vậy, chúng tôi có hai thuộc tính. nút_1_id và nút_2_nid. Và cả hai đều được tạo mà không bị gián đoạn bởi Chế độ xem. Họ không thể chỉ được gọi là "nid. "
Do đó, nếu bạn cần tìm giá trị của một NID nào đó, bạn phải viết tên bí danh. Những tên này được lưu trữ bởi Chế độ xem và nằm trong thuộc tính $this->aliases.
Do đó, để có được giá trị của NID, bạn nên viết mã theo những dòng này.
$nid = $row->{ $this->aliases['nid']};
Lệnh này sẽ bắt đầu tìm kiếm mảng $this->aliases để tìm giá trị của khóa nid.
Sau khi bạn nhận được một cái gì đó như thế này.
$nid = $string->node_1_id;
Sử dụng biến đối tượng PHP $this để truy cập tệp lớp bên trong
Điều chắc chắn đáng chú ý là truy cập các thuộc tính đối tượng PHP với $this một cách linh hoạt. Đặc biệt nếu bạn muốn đi trước một bước so với các lập trình viên khác và nhận được kết quả tốt hơn và nhanh hơn. Biến $this trong PHP là một con ngựa đen. Và chỉ những ai biết cách sử dụng đúng $this trong PHP mới nhận được nhiều hơn