Hãy xem xét đoạn mã sau, trong đó trình thiết lập bị phá vỡ có chủ ý do lỗi lập trình trần tục mà tôi đã thực hiện một vài lần trong quá khứ:
<?php
class TestClass {
private $testField;
function setField($newVal) {
$testField = $newVal;
// deliberately broken; should be `$this->testField = $newVal`
}
function getField() {
return $this->testField;
}
}
$testInstance = new TestClass();
$testInstance->setField("Hello world!");
// Actually prints nothing; getField() returns null
echo $testInstance->getField();
?>
Việc tôi tuyên bố $testField
ở đầu lớp giúp che giấu lỗi lập trình đó khỏi tôi. Nếu tôi không khai báo trường, thì tôi sẽ nhận được một cái gì đó tương tự như cảnh báo sau được in vào nhật ký lỗi của tôi khi gọi tập lệnh này, điều này có thể có giá trị để giúp tôi gỡ lỗi - đặc biệt là nếu tôi gặp lỗi như thế này một ứng dụng thực tế lớn và phức tạp:
Thông báo PHP: Thuộc tính không xác định: TestClass :: $ testField trong /var/www/test.php trên dòng 13
Với tuyên bố, không có cảnh báo.
Có lẽ tôi đang thiếu một cái gì đó, nhưng tôi chỉ biết hai lý do để khai báo các trường lớp trong PHP: thứ nhất, rằng các khai báo đóng vai trò là tài liệu, và thứ hai, rằng không có khai báo, người ta không thể sử dụng các công cụ sửa đổi truy cập private
và protected
truy cập, đó là được cho là hữu ích. Vì đối số sau không áp dụng cho các trường công khai - gán cho trường không được khai báo của một đối tượng làm cho nó thành công khai - nên đối với tôi, ít nhất tôi phải bình luận tất cả các khai báo trường công khai của mình. Các ý kiến sẽ cung cấp cùng một giá trị tài liệu, nhưng tôi sẽ được hưởng lợi từ các cảnh báo nếu tôi cố đọc một trường chưa được khởi tạo.
Tuy nhiên, về suy nghĩ xa hơn, dường như không có ý nghĩa gì để dừng lại ở đó. Vì theo kinh nghiệm của tôi, cố gắng đọc một trường chưa được khởi tạo là nguyên nhân gây ra lỗi phổ biến hơn nhiều so với việc cố đọc hoặc sửa đổi một trường riêng tư hoặc được bảo vệ một cách không chính xác (tôi đã từng làm việc trước đây trong sự nghiệp lập trình ngắn của mình, nhưng không bao giờ là sau ), có vẻ như tôi bình luận tất cả các tuyên bố trường - không chỉ công khai - sẽ là thực tiễn tốt nhất.
Điều khiến tôi do dự là tôi chưa bao giờ thấy ai khác làm điều đó trong mã của họ. Tại sao không? Có lợi ích gì khi khai báo các trường lớp mà tôi không biết? Hoặc tôi có thể sửa đổi cấu hình của PHP theo một cách nào đó để thay đổi hành vi của khai báo trường để tôi có thể sử dụng khai báo trường thực và vẫn được hưởng lợi từ các cảnh báo "Thuộc tính không xác định"? Hoặc có bất cứ điều gì khác mà tôi đã bỏ lỡ trong phân tích của tôi?
TRUE === $variable
để ngăn mình vô tình giao thay vì so sánh.