मैं जादू के तरीकोंtrigger_error
के संदर्भ में सही उपयोग (यदि कोई हो) पर एक सहकर्मी के साथ बहस कर रहा हूं । सबसे पहले, मुझे लगता है कि इस एक मामले को छोड़कर बचना चाहिए ।trigger_error
कहते हैं कि हमारे पास एक विधि है foo()
class A {
public function foo() {
echo 'bar';
}
}
अब कहते हैं कि हम सटीक समान इंटरफ़ेस प्रदान करना चाहते हैं, लेकिन सभी विधि कॉलों को पकड़ने के लिए एक जादू पद्धति का उपयोग करें
class B {
public function __call($method, $args) {
switch (strtolower($method)) {
case 'foo':
echo 'bar';
break;
}
}
}
$a = new A;
$b = new B;
$a->foo(); //bar
$b->foo(); //bar
दोनों कक्षाएं उसी तरह से हैं जैसे वे प्रतिक्रिया करते हैं, foo()
लेकिन एक अमान्य विधि को कॉल करते समय भिन्न होते हैं।
$a->doesntexist(); //Error
$b->doesntexist(); //Does nothing
मेरा तर्क यह है कि trigger_error
किसी अज्ञात तरीके के पकड़े जाने पर जादू के तरीकों को कॉल करना चाहिए
class B {
public function __call($method, $args) {
switch (strtolower($method)) {
case 'foo':
echo 'bar';
break;
default:
$class = get_class($this);
$trace = debug_backtrace();
$file = $trace[0]['file'];
$line = $trace[0]['line'];
trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR);
break;
}
}
}
ताकि दोनों वर्ग पहचान (लगभग) व्यवहार करें
$a->badMethod(); //Call to undefined method A::badMethod() in [..] on line 28
$b->badMethod(); //Call to undefined method B::badMethod() in [..] on line 32
मेरा उपयोग-केस एक ActiveRecord कार्यान्वयन है। मैं उन __call
तरीकों को पकड़ने और संभालने के लिए उपयोग करता हूं जो अनिवार्य रूप से एक ही काम करते हैं, लेकिन जैसे कि , Distinct
या जैसे संशोधक हैंIgnore
selectDistinct()
selectDistinctColumn($column, ..)
selectAll()
selectOne()
select()
या
insert()
replace()
insertIgnore()
replaceIgnore()
तरह के तरीके where()
, from()
, groupBy()
, आदि हार्ड-कोडेड हैं।
जब आप गलती से कॉल करते हैं तो मेरा तर्क उजागर होता है insret()
। यदि मेरे सक्रिय रिकॉर्ड कार्यान्वयन ने सभी तरीकों को हार्डकोड किया है तो यह एक त्रुटि होगी।
किसी भी अच्छे अमूर्त के साथ, उपयोगकर्ता को कार्यान्वयन के विवरण से अनजान होना चाहिए और केवल इंटरफ़ेस पर निर्भर होना चाहिए। जादू के तरीकों का उपयोग करने वाले कार्यान्वयन को किसी भी अलग तरह से व्यवहार क्यों करना चाहिए? दोनों में त्रुटि होनी चाहिए।
4.something
।