2012-02-03 12 views
15

Ví dụ:Làm thế nào để tránh tính năng động trong PHP (nâng cao một lỗi khi thiết lập một tài sản không khai báo)

error_reporting(E_ALL | E_STRICT); 
class Test {} 
$obj = new Test(); 
$obj->undeclared = "oops"; // I want an error here !! :(
echo $obj->algo;    // oops 

Tôi đã thử nghiệm nó trên PHP 5.2.11 và 5.3.0.

Tôi không muốn các thuộc tính động trong đối tượng của mình.
Có thể buộc PHP tăng ERROR trong tình huống đó không?

+0

Cách '$ obj-> undeclared' đang gây ra sự cố cho bạn? –

+0

Kiểm tra lớp học {public $ myVar; } $ obj-> my_var = TRUE;/* typo */if ($ obj-> myVar) {/ * oh oh! * /} – Enrique

+0

Bạn cần một IDE tốt để ngăn chặn lỗi đánh máy như thế này. –

Trả lời

13

Sử dụng __set()?

<?php 
class Test { 

    public $bar; 

    public function __set($name, $value) { 
     throw new Exception('Cant set!'); 
    } 
} 

$obj = new Test; 
$obj->bar = 'foo'; 
$obj->foo = 'evil'; 
?> 
+3

Có điều đó sẽ hiệu quả, nhưng sau đó tôi cần phải thay đổi tất cả các lớp của tôi để thêm chức năng đó, điều đó không tốt. Điều này nên được thực hiện một cách tự nhiên bằng PHP. – Enrique

+0

Bí quyết tuyệt vời !!!!! Kiểm tra rằng nó "kế thừa bình thường", vì vậy tôi sẽ sử dụng điều này trong các lớp cơ sở của tôi !! :) –

0

Bởi "Tôi không muốn các thuộc tính động trong đối tượng của mình". Tôi giả sử bạn có nghĩa là bạn không muốn biến đối tượng của bạn bao giờ được undefined? Nếu đây là trường hợp thì chỉ cần khởi tạo tất cả các biến lớp của bạn. Bạn thậm chí có thể làm cho họ tĩnh nếu bạn đang thực sự quan tâm đến họ được liên tục như trái ngược với năng động trong bất kỳ cách nào.

Nếu bạn cố gắng truy cập biến đối tượng không tồn tại, khi đó PHP sẽ sẽ phát sinh lỗi. Câu trả lời mà radmen đề nghị sẽ thực sự làm cho nó để thay vì ném một lỗi, PHP sẽ tự động tạo các biến đối tượng không xác định cho bạn trên bay.

+0

Không. Tôi muốn có Lỗi/Thông báo/Cảnh báo khi tôi đang cố đặt thuộc tính không được khai báo trong lớp của mình (nghĩa là, tôi không muốn thuộc tính động trong đối tượng của mình, nếu không được khai báo trong lớp thì không nên tồn tại, không bao giờ). Nếu tôi muốn điều đó, thì tôi sẽ sử dụng __set và __get. – Enrique

+0

Vâng, PHP thực hiện chính xác những gì bạn đang tìm kiếm. Bạn có thể cần phải thêm E_WARNING vào báo cáo lỗi của bạn để nó được hiển thị mặc dù. –

+1

không, không, và nếu bạn đọc ví dụ của tôi, bạn sẽ thấy tôi đang thêm E_ALL bao gồm E_WARNING (và tôi cũng thêm E_STRICT vì chỉ có trong E_ALL, ít nhất là trước 5.4) – Enrique

Các vấn đề liên quan