PHP Yöntem Zincirler - yansıtmak?

5 Cevap php

Is it possible to reflect upon a chain of method calls to determine at what point you are in the chain of calls? At the very least, is it possible to discern whether a method is the last call in the chain?

$instance->method1()->method2()->method3()->method4()

Bu nesnelerin örnekleri dönmek özelliklerini kullanarak aynı yapmak mümkün mü?

$instances->property1->property2->property3->property4

5 Cevap

Eğer aradığınız tüm yöntemleri akıcı arabirim (birlikte farklı nesneleri zincirleme aksine) oluşturmak için same nesne iade ediyorsanız, o nesnenin kendisi yöntem çağrıları kaydetmek için oldukça Önemsiz olmalıdır.

örneğin:

class Eg {
    protected $_callStack = array();

    public function f1()
    {
        $this->_callStack[] = __METHOD__;
        // other work
    }

    public function f2()
    {
        $this->_callStack[] = __METHOD__;
        // other work
    }

    public function getCallStack()
    {
        return $this->_callStack;
    }
}

Sonra gibi aramaları zincirleme

$a = new Eg;
$a->f1()->f2()->f1();

would leave the call stack like: array('f1', 'f2', 'f1');

Her yöntem geri döndüğünde, bir sonraki denir çünkü önce debug_backtrace (), "akıcı arabirimleri" (resimli "zincirleme" için uygun adı) kullanımı ile ilgili doğru olacak değil.

Zincirleme yöntemleri için, PHP5 en overloading methods (Bu durumda __call) kullanabilirsiniz.

Ben zincirleme özelliklerini izlemek isterim herhangi bir neden görmüyorum, ama bunu yaparken ısrar ederseniz, istenen işlevselliği eklemek için sınıfları __ aşırı yüklenme olsun yöntemini kullanabilirsiniz.

Eğer yukarıdaki önerileri nasıl kullanılacağını çözemedim varsa bana bildirin lütfen.

$instances->property1->property2->property3->property4->method();

VEYA

$instances->property1->property2->property3->property4=some_value

İlk soruya gelince: değil zincirinde nerede izlemek için bazı kod eklemeden.

Ben son yöntem çağrısı yapıldı olduğunda bilmek bir sınıf için uygun bir yol var sanmıyorum. , Idam> () - Ben size bir çeşit ihtiyaç sandın zincirin sonunda işlev çağrısı.

Ayrıca, bence böyle bir işlevselliği sağlayan muhtemelen kod çok büyülü yapmak ve sürpriz kullanıcı ve / veya hatalı belirtiler olurdu.