2012-06-17 44 views
6

Tôi đang cố gắng sử dụng hằng số làm tham số hàm, có thể kiểm tra loại hằng số này.PHP: hằng số là biến trong hàm

Ví dụ về những gì tôi muốn:

class ApiError { 
    const INVALID_REQUEST = 200; 
} 

class Response { 
    public function status(ApiError $status) { 
    //function code here 
    } 
} 

SỬ DỤNG:

$response = new Response(); 
$response->status(ApiError::INVALID_REQUEST); 

này shoud kiểm tra xem tình trạng $ cho là hằng số của lớp apiError. Có phải bất cư thứ gì như thế này đều được?

+0

trạng thái (apiError $ status) hy vọng thể hiện của lớp apiError không phải là giá trị không đổi –

+0

tôi biết, đó là lý do tại sao tôi hỏi "Làm thế nào để làm " – m4recek

Trả lời

5

Bạn có thể sử dụng in_array() để kiểm tra đối với các giá trị trong danh sách trắng, mà là một chiến lược khuyến cáo bất cứ khi nào bạn cần phải xác nhận đầu vào cho một bộ giá trị cụ thể:

// Test if it is in an array of valid status constants... 
$valid_statuses = array(
    ApiError::INVALID_REQUEST, 
    ApiError::INVALID_SOMETHINGELSE, 
    ApiError::STATUS_OK 
); 
if (in_array($status, $valid_statuses)) { 
    // it's an acceptable value 
} 

Để danh sách trắng tất cả các hằng số của một lớp, bạn có thể sử dụng phản ánh và lấy hằng từ ApiErrorvia ReflectionClass::getconstants()

$refl = new ReflectionClass('ApiError'); 
$valid_statuses = $refl->constants(); 
10

Như những người khác đã đề cập, không có giải pháp chung. Nhưng nếu bạn muốn làm điều đó một cách rất sạch sẽ, mô hình mỗi "đối tượng" mà bạn đang làm việc với (= mỗi tình trạng có thể), ví dụ:

interface ApiError { // make it an abstract class if you need to add logic 
    public function getCode(); 
} 

class InvalidRequestApiError implements ApiError { 
    public function getCode() { 
     return 200; 
    } 
} 

// Usage: 
$response = new Response(); 
$response->status(new InvalidRequestApiError()); 

class Response { 
    public function status(ApiError $status) { 
     echo "API status: " . $status->getCode(); 
    } 
    // ... 
} 

này lá bạn với rất nhiều lớp học , bởi vì bạn đóng gói các số đơn giản, nhưng cũng có khả năng gõ gợi ý.

+2

Tôi ghét đề xuất in_array() vì nó là lập trình hướng mảng theo hướng đối lập. –

0

Tôi thích phương pháp này tốt nhất:

class NoticeType { 
    const INFO = 'neutral'; 
    const WARN = 'alert'; 
    const FAIL = 'critical'; 
    const PASS = 'success'; 
    const LITE = 'brand'; 

    private $_type; 

    function __construct($NOTICE_constant) 
    { 
     if (!preg_match('/neutral|alert|critical|success|brand/', $NOTICE_constant)) 
      throw new \Exception('Invalid parameter for '.__CLASS__.' constructor'); 
     $this->_type = $NOTICE_constant; 
    } 
    function getType() { 
     return $this->_type; 
    } 
    function __toString() { 
     return $this->_type; 
    } 
    static function INFO() { 
     return new NoticeType(self::INFO); 
    } 
    static function WARN() { 
     return new NoticeType(self::WARN); 
    } 
    static function FAIL() { 
     return new NoticeType(self::FAIL); 
    } 
    static function PASS() { 
     return new NoticeType(self::PASS); 
    } 
    static function LITE() { 
     return new NoticeType(self::LITE); 
    } 
} 

Cách sử dụng rất thẳng về phía trước và bạn sẽ phải đi trên con đường của bạn để mess up:

function test (NoticeType $n) { 
    echo ($n == NoticeType::INFO)."\n"; 
} 

test (NoticeType::INFO()); 
1

Một cách tiếp cận khác sẽ được thay đổi cuộc gọi. Nếu chúng ta muốn kiểm tra xem const có tồn tại hay không, dòng này sẽ quá muộn. $response->status(ApiError::INVALID_REQUEST);

Trình thông dịch viên php cũng sẽ kiểm tra const để tồn tại và sẽ chết với Lỗi nghiêm trọng. Điều đó không thể bắt được bằng try().

Vì vậy, tôi sẽ đề nghị để sử dụng chuỗi như một tham số để kiểm tra sự tồn tại sử dụng định nghĩa()liên tục()

class ApiError { 
    const INVALID_REQUEST = 200; 
} 

class Response { 
    public function status($status) { 
    if (!defined('ApiError::'.$status)) { 
     return false; // Or throw Exception/other error handling 
    } 

    $errorCode = constant('ApiError::'.$status); 

    //function code here 
    return true; 
    } 
} 

Việc sử dụng sau đó sẽ trông như thế này:

$response = new Response(); 
$response->status('INVALID_REQUEST'); 

Điều xấu là không có gợi ý về loại cho giải pháp này.

+0

IMO đây là câu trả lời hay nhất nếu bạn cần giữ các hằng số. –

0

SplEnum có thể trợ giúp. Ví dụ từ tài liệu PHP:

class Month extends SplEnum { 
    const __default = self::January; 

    const January = 1; 
    const February = 2; 
    const March = 3; 
    const April = 4; 
    const May = 5; 
    const June = 6; 
    const July = 7; 
    const August = 8; 
    const September = 9; 
    const October = 10; 
    const November = 11; 
    const December = 12; 
} 

echo new Month(Month::June) . PHP_EOL; 

try { 
    new Month(13); 
} catch (UnexpectedValueException $uve) { 
    echo $uve->getMessage() . PHP_EOL; 
} 

Output:

6 
Value not a const in enum Month 
Các vấn đề liên quan