2009-05-29 39 views
6

Có thể thoát khỏi một cách dễ dàng từ một hàm tạo trong php không? Ảnh hưởng củaCó thể thoát ra một cách duyên dáng trong một nhà xây dựng không?

class Foo { 

function __construct() 
{ 

    $active = false; 

    if(!$active) 
    { 
    return false; 
    } 

} 

} 

Tôi đang cố gắng thực hiện điều này vì tôi muốn kiểm tra xem có bất kỳ phương pháp nào trong lớp nên chạy dựa trên tệp cấu hình hay không. Tôi không muốn phải kiểm tra tập tin cấu hình trong mọi phương pháp để xem các phương pháp có nên chạy hay không.

Trả lời

7

Điều đó phụ thuộc vào ý bạn là "duyên dáng". Nếu bạn muốn hàm tạo của bạn thất bại, bạn có thể ném một ngoại lệ hoặc bạn có thể sử dụng mẫu nhà máy:

class FooFactory { 
    function makeFoo() { 
     return $someConstraint ? null : new Foo(); 
    } 
} 

Có lẽ bạn có thể giải thích một chút về chính xác bạn muốn đạt được điều gì.

+1

tôi gọi lớp này từ tập tin khác.Nếu tôi đặt $ active là false, tôi sẽ không muốn chạy các phương thức nào và cho trang kia tải bình thường. Ví dụ, nếu tôi đặt một cái chết; trong cấu trúc, nó sẽ chết cho mọi trang đã gọi đối tượng đó. –

+0

Trong trường hợp đó, bạn có thể sử dụng mẫu nhà máy để trả về một đối tượng giả nếu $ active là false và đối tượng "thực" nếu nó không phải là. Đây không phải là giải pháp thanh lịch nhất nhưng nó sẽ làm điều này một cách độc đáo. – n3rd

0

Tôi nghĩ rằng N3rd đã đề xuất một giải pháp rất tuyệt nhưng đây là một phương pháp đơn giản khác.

class Foo { 

    private $active = TRUE; 

    function __construct() { 

     $this->check ($active); 

      //OR 
      //if ($this->check ($active)) { do something } 
    } 

    function check($var) { 
     if (! $var) { 
      $this->active = FALSE; 
      return FALSE; 
     } 
     return TRUE; 

    } 
} 
+0

Không hoạt động. Tôi không nghĩ rằng nó có thể trả về một giá trị trong cấu trúc. :/ –

+0

Nó Liều lượng công việc. Như bạn có thể gọi hàm như nếu ($ this-> check ($ active)) {do something} – Mantichora

1

Nếu nhà xây dựng của bạn không thành công, bạn nên ném ngoại lệ, không trả về giá trị giả. Trừ khi bạn đang sử dụng một ngôn ngữ như C, trong đó trường hợp ngoại lệ trong việc xây dựng các đối tượng có nghĩa là nó không bao giờ có thể được deconstructed.

Lý do cho điều này là do ngoại lệ buộc chương trình xử lý nó và cung cấp cho bạn dữ liệu không tốt. Nếu bạn trả về một giá trị, nói -1 hoặc bất cứ điều gì, chương trình có thể tiếp tục âm thầm và bỏ qua điều đó cho đến khi nó gây ra một vấn đề sau này xuống đường. Việc ném một ngoại lệ ngăn các lỗi im lặng này xâm nhập vào mã. Bạn có thể biết rằng nó trả về false nếu nó không xây dựng đúng, nhưng đồng nghiệp của bạn có thể không và có thể vui vẻ thử sử dụng một đối tượng mà anh ta nghĩ là những gì anh ta xây dựng để tìm ra rằng nó thực sự là một boolean.

3

Làm cho nó phát nổ. Không có thứ gì như một thất bại duyên dáng trong một nhà xây dựng. Có lẽ trong mã gọi, nhưng không phải trong hàm tạo. Ném một ngoại lệ và xử lý nó một cách thích hợp.

3

Tôi có thể ngửi thấy mẫu Proxy sắp tới. Những gì bạn đang cố gắng đạt được không phải là có hàm tạo thất bại một cách duyên dáng nhưng không cho phép các phương thức được gọi trên một đối tượng dựa trên một số tiêu chí hoạt động $.

This có thể chỉ cho bạn đúng hướng. Hoặc có thể không (= >> Tôi không thích trang tôi đã liên kết, nhưng đó là điều tốt nhất tôi có thể tìm thấy cho PHP). Làm cho Proxy một đọc, từ các nguồn khác quá có lẽ. Về cơ bản, ProxyObject của bạn sẽ có tham chiếu đến đối tượng thực thực tế sẽ phương thức thực hiện. Mã khách hàng của bạn sẽ gọi các phương thức trên ProxyObject như thể là điều thực sự và ProxyObject sẽ quyết định xem nó có hoạt động hay không, cho dù chuyển thông điệp vào điều thực tế hoặc trả lại không hoặc không có gì hoặc giá trị giả. Nghe hay sao?

2

Nếu hàm tạo thực hiện quá nhiều logic, thì nó không được thiết kế tốt. Để trống, chuyển cấu hình cho nó qua phương thức setter và để nó thất bại ở đó.

Nó không phải là lập trình OO:

$o = new myObject(); 
if (!is_object($o)) // then what??? 
Các vấn đề liên quan