ASP.NET PHP - call_user_func () eşdeğer?

2 Cevap php

PHP'nin call_user_func() ASP.NET uygulaması için eşdeğer bir işlevi olup olmadığını merak ediyorum. Ben profesyonelce yapılmış bir CMS alarak ve bu diğer dilde yeniden deneyerek, kendimi dil öğretim aracı olarak ASP.NET için bir PHP uygulama bir dönüşüm yapmak için arıyorum.

Benim PHP CMS mevcut yapısı bir eklenti mimarisi içerir ve CMS belirli parçaları eklentileri için kendilerini teşhir, ve daha sonra bir dizi olarak geri döndü bilgilerini ele çünkü buna benzer bir işlev gerekir nedenidir. Bu hemen hemen Drupal kullandığı aynı sistem.

Ben bu konuda yanlış yolda belki mıyım?

Ben açıklama için ben bu benim şimdiki sistemde nasıl çalıştığını bir örnek vermek gerektiğini düşünüyorum:

<?php
class Test {

    function TestMessage() {
        // set up array
        $arrTest = array("Hello", "World");
        // get extra values from all available plugins
        $arrExtras = CMS::InvokeHook("HelloTest");
        // now contains Hello, World, Foo, Bar
        $arrTests = array_merge($arrTest, $arrExtras);
    }

}

class CMS {
    InvokeHook($function) {
        // now contains a couple plugins
        $plugins = CMS::GetPlugins();
        // empty array of values
        $values = array();
        foreach($plugins as $plugin) {
            // if this plugin has the called method...
            if(method_exists($plugin, $function)) {
                // call the function and merge in the results
                $values[] = call_user_func(array($plugin, $function));
            }
        }
        // return results as an array
        return $values;
    }
}

class FooTest {
    function HelloTest() {
        return "Foo";
    }
}

class BarTest {
    function HelloTest() {
        return "Bar";
    }
}

?>

Bu bellekten yazıyorum InvokeHook () çağrısı basitleştirilmiş, ama bunun özü şudur: NOT.

2 Cevap

. NET'te muhtemelen bazı olayları oluşturmak ve bunları işlemek istiyorum. İşte bunu yapmanın bir yolu var:

public class CMS

    public Event DoSomethingHook(byval sender as Object, byval e as DoSomethingEventArgs)

    public function DoSomething()
    	dim data() as Integer = {} 
    	Dim e as new DoSomethingEventArgs();
    	e.data = data
    	RaiseEvent DoSomethingHook(Me, e)
    	data = e.data
    end function
end class


' Let's say Plugin base class contains a reference to CMS
public class CMSPlugin
    Inherits Plugin 

    public sub New()
    	' Register for a hook
    	AddHandler CMS.DoSomethingHook, AddressOf DoSomething
    end sub

    public function DoSomething(byval sender as Object, byval e as DoSomethingEventArgs)
    	' Do something with e.data
    end function
end class

public class DoSomethingEventArgs : Inherits EventArgs
    public data() as Integer
end class

. NET Devs için, bu temelde (bir dizge olarak) adı verilen bir yöntem çağıran bir yöntemdir.

OP: (Bence) Bu yansıma kullanmak zorunda. Bu kadar güzel hiçbir yerde yakın ve (IIRC) oldukça pahalı bu yüzden çok fazla kullanıldığında iyi değil.

System.Reflection.MethodInfo method = this.GetType().GetMethod(myMethodName);
// method.Invoke(args, null);

Ben halletmek için bu başvurmak varsa muhtemelen şeyleri "yanlış" bir şekilde yapıyor olabilir düşünüyorum. Daha iyi çalışır olası bir temizleyici desen var.

Ben plugin-mimarileri yaptık yolu böylece eklentileri * bir "plug-in" arabirimini uygulayan ve daha sonra ben. DoSomething () (vb) kullanılabilir bir yöntem olduğu için oraya gidiyor biliyorum * küresel ortak arayüzleri geçer. Hiçbir yansıma gerekli =)

* Ya Soyut Sınıflar .. Gerçekten, en iyi uyan ne olursa olsun!