마술 방법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
합니까?