私はtrigger_error
、魔法のメソッドのコンテキストでの正しい使用法(もしあれば)について同僚と議論しています。まず、この1つの場合を除いて、それtrigger_error
は避けるべきだと思います。
1つのメソッドを持つクラスがあるとします 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
でしょうか。