2010-10-23 44 views
6

Câu hỏi này: Best way to return status flag and message from a method in Java tương tự như của tôi, tuy nhiên tôi sẽ làm điều đó trong PHP chứ không phải Java (có thể tạo ra sự khác biệt nhỏ ở đây).Phương thức trả về phương thức: bool, string, const ... (PHP)

Vấn đề:

Có một phương pháp có thể có hoặc là một kết quả thành công (điều này có thể thay đổi được những thành công hơn) hoặc "có vấn đề" một. Điều thứ hai có nghĩa là hoạt động thất bại, nhưng điều quan trọng là phải biết tại sao. Hãy tưởng tượng một phương pháp của một lớp Xác thực:

public function login($name, $password) 
{ 
    if (successful_authentication) 
    { 
     report success 
    } 
    else 
    { 
     report failure, explain why (e.g. wrong name/pass, user banned) 
    } 
} 

Nó sẽ là tầm thường để trở về đúng và sai cho sự thành công và thất bại, nhưng làm thế nào để báo cáo nguyên nhân của thất bại?

giải pháp có thể:

  • Return đúng hay sai và viết phương pháp khác (getStatus()) để có được những vấn đề cụ thể: đây cảm thấy một chút vụng về với tôi
  • Sử dụng ngoại lệ: vì nó không đặc biệt đối với người dùng bị cấm (ngoại lệ sẽ là nếu người dùng sẽ chết trong khi gõ với tư cách tác giả khác trên trang này đã chỉ ra) việc sử dụng các ngoại lệ ở đây trong những trường hợp này sẽ là sai (mặc dù phương pháp có thể ném ngoại lệ cơ sở dữ liệu nếu truy vấn không thành công)
  • Return thật thành công và một chuỗi trên thất bại với một mã lỗi chỉ ra vấn đề: với PHP nó có thể cách này để có khối sạch đẹp như sau:

    $loginStatus = $auth->login('name', 'pass'); 
    if ($loginStatus === true) 
    { 
        doSomething(); 
    } 
    else 
    { 
        if ($loginStatus == 'wrong_login_data') 
        ... 
        elseif ($loginStatus == 'banned') 
        ... 
        // or with an array full of error messages: 
        echo $erroMessages[$loginStatus]; 
    } 
    
  • Return một tình trạng chung (nhà nước) đối tượng: rất giải pháp thanh lịch và cũng tương lai chứng minh (không có vấn đề nếu số lượng các trạng thái khác nhau hay muộn dữ liệu bổ sung nên được trả lại), có lẽ tốt nhất:

    $loginStatus = $auth->login('name', 'pass') 
    if ($loginStatus->isSuccess) 
    ... 
    else 
        echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example 
    
  • hoặc của hai bên trên, nhưng không phải với chuỗi đồng bằng nhưng hằng số lớp học:

    $loginStatus = $auth->login('name', 'pass') 
    if ($loginStatus->isSuccess) 
    ... 
    elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED) 
    ... 
    

    Với điều này sẽ không cần thiết để giải thích các mã lỗi trong tài liệu và cũng sẽ cảm thấy "tự nhiên" hơn (ít nhất là đối với tôi).

Câu hỏi đặt ra:

bạn sẽ sử dụng gì (trong những người ở trên hoặc bất kỳ giải pháp khác)? Điều gì đã được chứng minh về lâu dài là một cách tốt?

Cảm ơn bạn trước!

Trả lời

2

Đây là cách PEAR đã thực hiện nó miễn là tôi có thể nhớ. Vì vậy, đây là một phương pháp thử và thử nghiệm.

class LoginError { 
    private $reason; 

    public function __construct($reason) 
    { 
     $this->reason = $reason; 
    } 

    public function getReason() 
    { 
     return $this->reason; 
    } 
} 

function isError($response) 
{ 
    return ($response instanceof LoginError); 
} 

public function login($name, $password) 
{ 
    if (successful_authentication) 
    { 
     return true; 
    } 
    else 
    { 
     return new LoginError('The password is incorrect'); 
    } 
} 


$loginStatus = login('name', 'pass'); 
if (!isError($loginStatus)) 
{ 
    doSomething(); 
} 
else 
{ 
    echo $loginStatus->getReason(); 
} 
+0

Thật là một sự xấu hổ tôi đã chờ đợi quá lâu với việc chấp nhận câu trả lời :-). – Piedone

2

Ném ngoại lệ. Nếu kiểm tra giá trị trả về là bắt buộc, thì bất kỳ lỗi nào để làm như vậy sẽ cho phép đăng nhập trái phép. Thất bại trong việc kiểm tra một ngoại lệ sẽ thổi toàn bộ điều lên, mà có vẻ thích hợp hơn trong trường hợp này.

Ở những điểm ít quan trọng hơn nếu tôi đang kiểm tra đối tượng đã tồn tại, tôi có thể trả lại mã kết quả và có chức năng riêng để truy xuất thư, nhưng tôi sẽ không thực hiện điều gì đó thành một đối tượng chỉ để sử dụng kỹ thuật đó. Nếu không, tôi sẽ đi với một đối tượng trạng thái có chứa mã kết quả và thông báo.

+0

Cảm ơn bạn đã trả lời! Lưu ý rằng đây sẽ chỉ là một phương thức đăng nhập, nhưng không phải là một phương pháp để kiểm tra xem người dùng đã được xác thực chưa (không thực hiện việc này sẽ thực sự gây ra rắc rối). Tôi không nghĩ rằng sự thất bại để đăng nhập sẽ là một ngoại lệ (chỉ cần nghĩ về việc nhập sai mật khẩu của bạn - nó không phải là một trường hợp rất hiếm) và do đó nó sẽ là một cách sử dụng các ngoại lệ cho dòng chương trình bình thường. Nhưng chúng ta không chỉ nghĩ về một phương thức đăng nhập, tôi muốn biết kỹ thuật tốt nhất với bất kỳ phương pháp nào có thể có trạng thái thành công và thất bại. – Piedone

+0

@piedone - chỉnh sửa –

1

Tôi sẽ đi với biến thể của "Trả về trạng thái chung (trạng thái) đối tượng" nơi trạng thái được mô tả bởi đối tượng auth của bạn.

Vì vậy, $ auth-> login ('name', 'pass') là một bool đơn giản và $ auth-> getState() là một enum hoặc chuỗi (dành cho người dùng cuối có lẽ) mô tả trạng thái.

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