ฉันมีการอภิปรายกับเพื่อนร่วมงานที่ผ่านการใช้งานที่ถูกต้อง (ถ้ามี) ของ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
Use-case ของฉันคือการนำไปใช้งานของ ActiveRecord ฉันใช้__call
เพื่อจับและจัดการวิธีการที่ทำสิ่งเดียวกัน แต่มีตัวดัดแปลงเช่นDistinct
หรือIgnore
เช่น
selectDistinct()
selectDistinctColumn($column, ..)
selectAll()
selectOne()
select()
หรือ
insert()
replace()
insertIgnore()
replaceIgnore()
วิธีการเช่นwhere()
, from()
, groupBy()
ฯลฯ กำหนดค่าตายตัว
insret()
อาร์กิวเมนต์ของฉันเป็นไฮไลต์เมื่อคุณเผลอเรียก หากการบันทึกที่ใช้งานอยู่ของฉันฮาร์ดโค้ดทั้งหมดแล้วมันจะเป็นข้อผิดพลาด
เช่นเดียวกับสิ่งที่เป็นนามธรรมที่ดีผู้ใช้ควรไม่ทราบรายละเอียดของการติดตั้งและใช้อินเทอร์เฟซ แต่เพียงผู้เดียว ทำไมการปรับใช้ที่ใช้วิธีการเวทย์มนตร์จึงมีความแตกต่างกัน? ทั้งสองควรเป็นข้อผิดพลาด
4.something
?