2013-06-24 27 views
6

Temelde, Laravel yöntemlerini bulma, bulma, bulma ve kullanma gibi uygulama gereksinimlerini bildiren bir arabirim var.bilgilendirme arayüz yöntemleri __call ile uygulanmaktadır?

Arabirimdeki bu yöntemleri açıklarım çünkü arabirimi uygulayan her şey elverişli olamayacak, ben de onları arayüzde bildireceğim, böylece uygulamamın her zaman yöntemleri anlayacağını biliyordum.

Bilmek istiyorum arabirim yöntemi __call aracılığıyla işlendiğini bildirmek için kolay bir yol yoktur anlamlı bir model uzatmak yapmak modellerinde public function find($id){return parent::find($id)} tip yöntemlerin bir demet sahip başka, nedir?

+0

Ayrıca bkz: https: //bugs.php.net/bug.php?id=41162. –

cevap

3

Hayır, bu işe yaramayacaktır. Dinamik kodlama stili için __call() gerçekten güzel olsa da, bir arabirimde dinamik yöntemlerin imzalarını zorlayamayacağınız ve bunun için otomatik bir belge almayacağınız dezavantajlarıdır.

Ancak, bu yöntemler için bir arabirim oluşturmak istediğiniz bir noktadaysanız, __call() artık kullanılmaya gerek olmadığını düşünüyorum. Sadece hardcode yöntemlerini kullanırdım.

+0

Tasarım sorunlarınız var gibi görünüyor. Daha fazla yardım etmek isterdim ama soru biraz belirsiz. Temel bir örnek gösterebilir misiniz? – hek2mgl

4

böyle bir tasarımın temizlik konusunda daha büyük bir soru, arayüzün yöntemleri uygulayan bir özelliği kullanarak bu benzer bir şey başarabilirsiniz olabilir rağmen:

interface FindableContract { 
    public function find($id); 
} 

trait MagicFindableTrait { 
    public function find($id) { 
     return static::__call(__FUNCTION__, func_get_args()); 
    } 
} 

class MagicalParent { 
    public function __call($method, $args) { 
     if ($method == 'find') { 
      return "User " . $args[0] . " is a witch! May we burn her?!"; 
     } 
    } 
} 

class User extends MagicalParent implements FindableContract { 
    use FindableTrait; 
} 

class NonmagicalUser implements FindableContract { 
    public function find($id) { 
     return "User $id was found to be nonmagical. Let's burn him anyway."; 
    } 
} 

print (new User)->find(123); 
print (new NonmagicalUser)->find(321); 
+1

Sonunda, yükseltmeye karar verdim çünkü bence gerçekten zekice. Bir süreliğine tereddüt ettim çünkü bence gerçekten zekice. –

+1

Katılıyorum Dennis, bu genellikle çok kötü bir fikir konuşuyor. Bunun gibi bir şey için birincil kullanım akademik/merak/kibarlıktır. Muhtemelen gerçek dünyadaki kodlarda kullanılmamalıdır. – Gabriel