Tôi đang có một cuộc tranh luận với một đồng nghiệp về cách sử dụng đúng (nếu có) trigger_error
trong bối cảnh của các phương pháp ma thuật . Đầu tiên, tôi nghĩ rằng trigger_error
nên tránh ngoại trừ trường hợp này.
Nói rằng chúng tôi có một lớp với một phương thức foo()
class A {
public function foo() {
echo 'bar';
}
}
Bây giờ nói rằng chúng tôi muốn cung cấp cùng một giao diện nhưng sử dụng một phương thức ma thuật để bắt tất cả các cuộc gọi phương thức
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
Cả hai lớp đều giống nhau theo cách chúng phản hồi foo()
nhưng khác nhau khi gọi một phương thức không hợp lệ.
$a->doesntexist(); //Error
$b->doesntexist(); //Does nothing
Lập luận của tôi là các phương thức ma thuật nên gọi trigger_error
khi một phương thức không xác định bị bắt
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;
}
}
}
Vì vậy, cả hai lớp cư xử (gần như) giống hệt nhau
$a->badMethod(); //Call to undefined method A::badMethod() in [..] on line 28
$b->badMethod(); //Call to undefined method B::badMethod() in [..] on line 32
Trường hợp sử dụng của tôi là một triển khai ActiveRecord. Tôi sử dụng __call
các phương pháp đánh bắt và xử lý mà chủ yếu làm điều tương tự nhưng có bổ như Distinct
hay Ignore
, ví dụ như
selectDistinct()
selectDistinctColumn($column, ..)
selectAll()
selectOne()
select()
hoặc là
insert()
replace()
insertIgnore()
replaceIgnore()
Các phương pháp như where()
, from()
, groupBy()
vv được mã hóa cứng.
Đối số của tôi được tô sáng khi bạn vô tình gọi insret()
. Nếu việc thực hiện bản ghi hoạt động của tôi đã mã hóa tất cả các phương thức thì đó sẽ là một lỗi.
Như với bất kỳ sự trừu tượng hóa tốt nào, người dùng nên không biết về các chi tiết thực hiện và chỉ dựa vào giao diện. Tại sao việc thực hiện sử dụng các phương pháp ma thuật lại hành xử khác đi? Cả hai nên là một lỗi.
4.something
?