Viết đầu tiên thực PHP lớp của tôi và tình cờ gặp một vấn đề, sau đây là phương pháp __construct tôi:Hợp lệ hóa __construct, đảm bảo vars của của đúng loại
public function __construct($foo,$bar) {
$this->foo = $foo;
$this->bar = $bar;
}
Cả $foo
và $bar
được yêu cầu, nếu không có họ, các phương pháp sẽ thất bại và cung cấp cho các lỗi php. OK khi chúng không được xác định khi đối tượng được khởi tạo:
$var = new Class();
Vì điều này sẽ gây ra lỗi (ví dụ: Lớp yêu cầu 2 thông số không được đặt). Nhưng nếu chúng được đặt nhưng không phải là loại dữ liệu chính xác như vậy:
$var = new Class('33','ddd');
Phương pháp của tôi vẫn sẽ thử và chạy sai biến, sau đó in ra lỗi.
Thực tiễn tốt nhất để xác thực những điều này là gì? Trong cấu trúc hoặc trong mỗi phương pháp?
Giải pháp của tôi mà tôi đang sử dụng ngay bây giờ làm việc, nhưng tôi không chắc chắn nếu đó là cách 'đúng':
//$foo needs to be a string with letters only
//$bar needs to be an integer
public function __construct($foo,$bar) {
$this->foo = $foo;
$this->bar = $bar;
if(!is_numeric($bar)){
//print error msg
}
elseif(other validation case)
etc...
}
Các khái niệm về lập trình OO là khá mới mẻ với tôi, vì vậy liên kết bất kỳ tài liệu tham chiếu nào bạn đã sử dụng sẽ được đánh giá cao.
bạn không nên "thông báo lỗi print" trong một nhà xây dựng, bạn nên ném một ngoại lệ (như trong @ Gordon của câu trả lời dưới đây). Mục đích của nhà xây dựng là có một đối tượng hợp lệ sau khi nó được gọi. Bởi chỉ cần in một thông báo lỗi thay vì một ngoại lệ, bạn sẽ rất có thể kết thúc với một đối tượng không hợp lệ sẽ vít lên toàn bộ chương trình của bạn. – netcoder
Không, bạn không nên sử dụng ngoại lệ. Sử dụng 'assert()' để kiểm tra các kiểu biến. Đối số không hợp lệ là vấn đề phát triển quan trọng nhất. Đây là bạn muốn bắt những vấn đề như vậy. Các ngoại lệ nên được sử dụng khi các đối số không hợp lệ được dự kiến trong thời gian chạy và nếu bạn có thể triển khai logic bắt logic hợp lý để thử lại với các đối số thay thế. Ví dụ. [Assert vs Exceptions] (http://stackoverflow.com/questions/117171/design-by-contract-tests-by-assert-or-by-exception/117247#117247) nhưng cũng thấy các bản sao .. – mario
@mario: Tôi đồng ý rằng 'khẳng định' có thể được sử dụng để kiểm tra các loại nội bộ. Nhưng không phải trong một nhà xây dựng. Một đối số xấu được truyền cho một hàm tạo và nó là một ngoại lệ, một ngoại lệ là một tình huống đặc biệt mà chương trình không thể tiếp tục được nữa. Nếu một hàm tạo có các đối số sai được truyền cho nó, thì nó sẽ không tiếp tục. Nếu không, như tôi đã nói, bạn kết thúc với một đối tượng không hợp lệ và một chương trình hoạt động mà lấy đối tượng là hợp lệ, và tiếp tục đi cho đến khi một số trục vít lớn xảy ra (rác được chèn liên tục trong DB của bạn cho mỗi ví dụ). – netcoder