Bir meslektaşımla sihirli yöntemlertrigger_error
bağlamında (varsa) doğru kullanımı konusunda bir tartışma yaşıyorum . İlk olarak, bu tek durum dışında bundan kaçınılması gerektiğini düşünüyorum .trigger_error
Diyelim ki tek yöntemli bir sınıfımız var foo()
class A {
public function foo() {
echo 'bar';
}
}
Şimdi aynı arayüzü sağlamak istediğimizi, ancak tüm yöntem çağrılarını yakalamak için sihirli bir yöntem kullandığımızı söyleyin
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
Her iki sınıf da yanıt verme biçimleriyle aynıdır, foo()
ancak geçersiz bir yöntem çağrılırken farklılık gösterir.
$a->doesntexist(); //Error
$b->doesntexist(); //Does nothing
Benim iddiam, trigger_error
bilinmeyen bir yöntem yakalandığında sihirli yöntemlerin çağırması gerektiğidir
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;
}
}
}
Böylece her iki sınıf da (neredeyse) aynı şekilde davranır
$a->badMethod(); //Call to undefined method A::badMethod() in [..] on line 28
$b->badMethod(); //Call to undefined method B::badMethod() in [..] on line 32
Kullanım durumum bir ActiveRecord uygulamasıdır. Kullandığım __call
aslında aynı şeyi yapmak ama da değiştirici sahip yakalamak ve sap yöntemlerine Distinct
ya Ignore
, mesela
selectDistinct()
selectDistinctColumn($column, ..)
selectAll()
selectOne()
select()
veya
insert()
replace()
insertIgnore()
replaceIgnore()
Gibi yöntemler where()
, from()
, groupBy()
vb sabit kodludur.
Yanlışlıkla aradığınızda argümanım vurgulanır insret()
. Benim aktif kayıt uygulama tüm yöntemleri kodladı, o zaman bir hata olurdu.
Herhangi bir iyi soyutlamada olduğu gibi, kullanıcı uygulama detaylarından habersiz olmalı ve sadece arayüze güvenmelidir. Sihirli yöntemleri kullanan uygulama neden farklı davranmalı? Her ikisi de bir hata olmalıdır.
4.something
?