2011-06-06 23 views
11

Bir sınıf belirlemek için bir yöntem var, böylece bir yöntem tanımlanmamışsa, bir hata atmak yerine bir yakalama işlevine giderdi?PHP - bir sınıfta catchall yöntemi

$myClass->foobar(); numaralı telefonu arayabilirsem ancak sınıf tanımında hiçbir zaman foobar ayarlanmadıysa, başka bir yöntem bunu ele alır?

cevap

15

Evet, overloading var:

class Foo { 
    public function __call($method, $args) { 
     echo "$method is not defined"; 
    } 
} 

$a = new Foo; 
$a->foo(); 
$b->bar(); 

PHP 5.3 itibaren, statik yöntemlerle bunu da yapabilirsiniz:

class Foo { 
    static public function __callStatic($method, $args) { 
     echo "$method is not defined"; 
    } 
} 

Foo::hello(); 
Foo::world(); 
+1

+1 Eklemek gerekirse, * PHP * aşırı yüklenme, yani (açıklanamaz) diğer OOP dillerinden farklı bir terim kullanımı. – webbiedave

1

Magic methods. Özellikle, __call().

+0

__invoke __call farklı bir şeydir. – akond

+0

__invoke, @changokun 'nun yapmak istediği bir cevap olurdu 'myclass();' –

+0

@akond: Şüphesiz, zaten sabitlediğim bir zihin boşluğu oldu. –

6

Çağrılan yöntemleri ve bunların argümanlarını yakalamak için __call() kullanmak istiyorsunuz.

6

Evet, uygun bir yöntem bulunmadığında çağrılan __call sihirli yöntemini kullanabilirsiniz. Örnek:

class Foo { 
    public function __call($name, $args) { 
     printf("Call to %s intercepted. Arguments: %s", $name, print_r($args, true)); 
    } 
} 

$foo = new Foo; 
$foo->bar('baz'); // Call to bar intercepted. Arguments: string(3) 'baz' 
İlgili konular