Tôi đang cố gắng sử dụng bộ tổng hợp truy cập trên một thành phần trên Lucee (mặc dù vấn đề này dường như giống nhau trên Coldfusion quá).Hành vi không mong muốn với accessors = true trên một thành phần
đangRepro:
// Person.cfc
component accessors=true {
property firstName;
property lastName;
function init(firstName, lastName){
variables.firstName = arguments.firstName;
variables.lastName = arguments.lastName;
}
}
Và mã gọi:
// person.cfm
person = new Person("Abigail", "Bowen");
writeDump(person);
Chú ý cách tôi không sử dụng accessors tổng hợp ở đây, tôi hoàn toàn thiết lập các giá trị đối số vào cùng tên biến biến có phạm vi biến.
Tuy nhiên khi tôi chạy mã này, tôi thấy điều này:
Lưu ý cách các thuộc tính đã được dân cư. Không có vấn đề với điều này, nhưng tôi rõ ràng không hiểu làm thế nào cờ accessors
là nghĩa vụ phải làm việc. Tôi nghĩ rằng nó chỉ đơn thuần là nhằm tổng hợp một số phương pháp truy cập cho tôi (mà nó có), nhưng đó là tất cả.
Cũng lưu ý rằng nếu tôi sửa đổi định nghĩa CFC để không bộ accessors true, sau đó bãi cho thấy điều này:
Vì vậy, không accessors tổng hợp (như mong đợi), mà còn bây giờ là các thuộc tính thậm chí không được hiển thị (với các giá trị biến có phạm vi hay không).
Tôi không thực sự hiểu được sự nhầm lẫn này của "thuộc tính" và cài đặt trình truy cập? Chắc chắn các thiết lập accessors chỉ nên tác động cho dù những phương thức accessor được tạo ra?
Nếu tôi chỉ nhìn thấy điều này trên một trong các nền tảng, tôi có thể đặt nó xuống một cách mơ hồ về cách writeDump()
diễn giải định nghĩa thuộc tính. Nhưng hành vi là như nhau trên ColdFusion 11, vì vậy nó thực sự có vẻ như có một số khác biệt trong hành vi tôi không hoàn toàn nhận được.
Có ai có thể giải thích điều này không? Có bất kỳ tài liệu nào giải thích nó không? Nếu không ... um ... tại sao không?
Mối quan tâm cơ bản của tôi ở đây là giá trị thuộc tính không được lưu trữ "đúng" và có thể gây ra sự cố cho tôi khi tôi triển khai thêm mã.
CẬP NHẬT: Ít nhất trên ColdFusion, có vẻ như chỉ là một thay đổi trong hành vi của writeDump()
, bởi vì nếu có getters cho các thuộc tính (có hoặc không đặt cờ accessors
) thì giá trị thuộc tính bắt đầu hiển thị trong bãi chứa. Đây không phải là trường hợp của Lucee, vì vậy vẫn còn một dấu hỏi ở đó.
Để được tiết lộ đầy đủ, câu hỏi này là bản tóm tắt câu hỏi tôi cũng đã hỏi trên blog của mình ("CFML: trying to understand accessors"). Sự trùng lặp là cố ý vì blog của tôi thu hút được nhiều đối tượng khác nhau từ trang web này.
Vâng, điều này có vẻ không rõ (xem bản cập nhật của tôi). Hành vi của Lucee hơi có mâu thuẫn với ColdFusion ở đây. Tôi đoán Lucee tìm kiếm thiết lập * và * các phương pháp; CF chỉ tìm kiếm các phương pháp. Và sự khác biệt hoàn toàn nằm trong hành vi đổ rác, không phải bất cứ thứ gì khác. –
Đây có phải là trường hợp hoạt động của hàm tạo CF9 không? Trong CF9, init() đã trở thành một hàm tạo đúng trong đó nếu bạn có một, nó được tự động gọi khi bạn sử dụng từ khóa mới, giống như trong Java. Điều tương tự cũng xảy ra nếu bạn đổi tên init() thành Person(). Nếu các bạn là chính xác, nó cũng sẽ xảy ra nếu bạn sử dụng một số tên hàm khác - mà nó không có. Nó chỉ xảy ra khi CF đang chạy như một hàm tạo. – ialexander