Saya berdebat dengan seorang kolega tentang penggunaan yang benar (jika ada) trigger_error
dalam konteks metode sihir . Pertama, saya pikir itu trigger_error
harus dihindari kecuali untuk kasus yang satu ini.
Katakanlah kita memiliki kelas dengan satu metode foo()
class A {
public function foo() {
echo 'bar';
}
}
Sekarang katakan kita ingin memberikan antarmuka yang sama persis tetapi menggunakan metode ajaib untuk menangkap semua panggilan metode
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
Kedua kelas sama dalam cara mereka merespons foo()
tetapi berbeda ketika memanggil metode yang tidak valid.
$a->doesntexist(); //Error
$b->doesntexist(); //Does nothing
Argumen saya adalah bahwa metode ajaib harus memanggil trigger_error
ketika metode yang tidak diketahui ditangkap
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;
}
}
}
Sehingga kedua kelas berperilaku (hampir) identik
$a->badMethod(); //Call to undefined method A::badMethod() in [..] on line 28
$b->badMethod(); //Call to undefined method B::badMethod() in [..] on line 32
Kasing saya adalah implementasi ActiveRecord. Saya menggunakan __call
untuk menangkap dan menangani metode yang pada dasarnya melakukan hal yang sama tetapi memiliki pengubah seperti Distinct
atau Ignore
, misalnya
selectDistinct()
selectDistinctColumn($column, ..)
selectAll()
selectOne()
select()
atau
insert()
replace()
insertIgnore()
replaceIgnore()
Metode seperti where()
, from()
, groupBy()
, dll keras-kode.
Argumen saya disorot ketika Anda secara tidak sengaja menelepon insret()
. Jika implementasi rekaman aktif saya hardcoded semua metode maka itu akan menjadi kesalahan.
Seperti halnya abstraksi yang bagus, pengguna harus tidak mengetahui detail implementasi dan hanya mengandalkan antarmuka. Mengapa implementasi yang menggunakan metode sihir berperilaku berbeda? Keduanya harus menjadi kesalahan.
4.something
?