PHP: Başka bir sınıf yöntemi çalıştırdığınızda sınıf yöntemi çalıştırmak?

5 Cevap php

PHP: run function when a specific class method is run

Bir sınıf yöntemi mevcut sınıfını değiştirmeden çalıştırdığınızda ne istediğiniz bazı ek fonksiyonları çalıştırmak.

nasıl?

5 Cevap

With a decorator:

class MyClassDecorator
{
    protected $decoratedInstance;

    public function __construct($decoratedInstance)
    {
        $this->decoratedInstance = $decoratedInstance;
    }

    public function methodNameInOriginalClass()
    {
        $this->decoratedInstance->methodIWantToRunBefore();
        $this->decoratedInstance->methodNameInOriginalClass();
        $this->decoratedInstance->methodIWantToRunAfter();
    }

    public function __call($method, $args)
    {
        if (method_exists($this->decoratedInstance, $method)) {
            return call_user_func_array(
                array($this->decoratedInstance, $method), 
                $args
            );
        }
    }
}

Yukarıdaki aramak istediğiniz yöntemler olduğunu varsayar public $decoratedInstance üzerine.

Bu mümkün değil, bunu elde etmek işlevini değiştirmek zorunda kalacak. Ama ihtiyacı olabilecek bir observer pattern (zend adamlar da, observer pattern on zend.com tarif)

Yapabileceğiniz en iyi şey, orijinal sınıfını genişletmek ve kod ekleyerek yöntemi geçersiz kılmak için.

class MyClass extends OriginalClass
{
    public function originalMethod()
    {
        parent::originalMethod();

        // My code...
    }
}

$myClass = new MyClass();
$myClass->originalMethod();

Ne yapmaya çalışıyorsun denir Aspect Oriented Programming.

Eğer uzantıları kullanabilirsiniz rağmen şu anda PHP, kutunun o dışarı için destek değil. http://sebastian-bergmann.de/archives/573-Current-State-of-AOP-for-PHP.html: İşte bazı seçenekler açıklıyor post

  • runkit: Değiştir, yeniden adlandırma, ve kullanıcı tanımlı işlevleri ve sınıfları kaldırmak.
  • funcall: önce veya belirli işlevleri / yöntemleri çağrıldığını sonra geri çağırır.
  • intercept: kullanıcı belirtilen işlev veya yöntem çağrıldığında adında bir kullanıcı alanı fonksiyonuna sahip sağlar.

Bu kullanarak mutlaka iyi bir fikir değil.