2012-06-17 21 views
6

में स्थिर के रूप में निरंतर मैं फ़ंक्शन पैरामीटर के रूप में निरंतर उपयोग करने की कोशिश कर रहा हूं, क्या यह निरंतर प्रकार की जांच करना संभव है।PHP: फ़ंक्शन

जो मैं चाहता का उदाहरण:

class ApiError { 
    const INVALID_REQUEST = 200; 
} 

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

उपयोग:

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

यह है कि दिए गए $ स्थिति की जांच shoud वर्ग apiError की निरंतर है। क्या ऐसा कुछ संभव है?

+0

स्थिति (apiError $ स्थिति) apiError वर्ग के उदाहरण नहीं निरंतर मूल्य –

+0

मुझे पता है, यही कारण है कि मैं "पूछ रहा हूँ कैसे करना है उम्मीद यह " – m4recek

उत्तर

5

आप in_array() उपयोग कर सकते हैं श्वेतसूची में डाले गए मूल्यों के खिलाफ परीक्षण करने के लिए है, जो एक सिफारिश की रणनीति जब भी आप किसी विशिष्ट मान सेट करने के लिए इनपुट को मान्य करने की आवश्यकता है:

// 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 
} 

एक वर्ग के सभी स्थिरांक श्वेत सूची में डालने के लिए, आपको प्रतिबिंब इस्तेमाल कर सकते हैं और दूसरों उल्लेख किया है से ApiErrorvia ReflectionClass::getconstants()

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

स्थिरांक को पुनः प्राप्त, वहाँ कोई सामान्य समाधान है। लेकिन आप हर "वस्तु" है कि आप के साथ (= हर संभव स्थिति) काम कर रहे है, जैसे एक बहुत साफ तरह से यह करने के लिए, मॉडल चाहते हैं, तो:

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(); 
    } 
    // ... 
} 

यह कक्षाओं का एक बहुत कुछ के साथ आप छोड़ देता है , क्योंकि आप सरल संख्याओं को समाहित करते हैं, लेकिन टाइप-इशारा करने की क्षमता के साथ भी।

+2

मुझे in_array() प्रस्ताव से नफरत है क्योंकि यह ऑब्जेक्ट उन्मुख के विपरीत सरणी उन्मुख प्रोग्रामिंग है। –

0

मैं इस दृष्टिकोण सबसे ज्यादा पसंद:

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); 
    } 
} 

प्रयोग बहुत सीधी-सपाट है और आप ऊपर गड़बड़ करने के लिए अपने रास्ते से हट जाने के लिए होगा:

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

test (NoticeType::INFO()); 
1

एक अन्य दृष्टिकोण होगा कॉल बदलें यदि हम जांचना चाहते हैं कि कॉन्स्ट मौजूद है या नहीं, तो यह लाइन बहुत देर हो जाएगी। $response->status(ApiError::INVALID_REQUEST);

PHP दुभाषिया अस्तित्व के लिए भी आधार की जांच करेगा और घातक त्रुटि के साथ मर जाएगा। यह कोशिश() का उपयोग कर पकड़ने योग्य नहीं है।

तो मैं अस्तित्व परिभाषित का उपयोग कर जांच करने के लिए एक पैरामीटर के रूप स्ट्रिंग का उपयोग करना सुझाव है() और निरंतर()

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; 
    } 
} 

उपयोग तो इस प्रकार दिखाई देगा:

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

खराब बात यह है कि इस समाधान के लिए कोई प्रकार संकेत नहीं है।

+0

आईएमओ यदि आपको स्थिरांक रखने की आवश्यकता है तो यह सबसे अच्छा जवाब है। –

0

SplEnum मदद कर सकता है।पीएचपी डॉक्स से उदाहरण:

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; 
} 

आउटपुट:

6 
Value not a const in enum Month 
संबंधित मुद्दे