Php bir geri çağırma temsilci işlevi gibi bir şey

3 Cevap php

PHP c # temsilci yöntemine benzer bir şey uygulamak istiyoruz. Ben genel olarak yapmak ne çalışıyorum açıklamak için hızlı bir kelime: Biraz uyumsuz işlevselliğini uygulamak çalışıyorum. Temel olarak, sıraya alınır ve temel sistem etrafında ona aldığında gönderilir olsun bazı kaynak-yoğun çağrılar. Uyumsuz çağrı nihayet bir yanıt aldığında ben sorulması gereken bir geri arama olayı istiyorum.

PHP geri çağrıları yapmak için bir mekanizma ile geliyor bazı sorunlar yaşıyorum. Ben şimdi çalışıyor ama ben onunla mutsuz bir yöntem ile geldi. Temelde bu nesne ve geri arama (bir argüman olarak tepkisini alarak) olarak hizmet verecek üzerinde yöntemin adına bir başvuru geçen içerir ve daha sonra Gerek duyulursa zaman yöntemini çağırmak için eval kullanın. Bu, çeşitli nedenlerle için sub-optimal herkes bilir bunu yapmanın daha iyi bir yolu var mı?

3 Cevap

(Apart gözlemci desen) ayrıca) (call_user_func () veya call_user_func_array kullanabilirsiniz.

Ilk parametre olarak bir dizi (obj, metodAdı) geçerseniz o çağrılır gibi $ obj-> metodAdı ().

<?php
class Foo {
    public function bar($x) {
        echo $x;
    }
}

function xyz($cb) {
    $value = rand(1,100);
    call_user_func($cb, $value);
}

$foo = new Foo;
xyz( array($foo, 'bar') );

Nasıl Observer desen kullanarak hakkında ne düşünüyorsunuz? Eğer değilse, gerçek bir geri aramasını bu şekilde uygulayabilirsiniz:

// This function uses a callback function. 
function doIt($callback) 
{ 
    $data = "this is my data";
    $callback($data); 
} 


// This is a sample callback function for doIt(). 
function myCallback($data) 
{ 
    print 'Data is: ' .  $data .  "\n"; 
} 


// Call doIt() and pass our sample callback function's name. 
doIt('myCallback');

Görüntüler: Veri: Bu benim veriler

Biz birinci sınıf işlevi "tür" yaratmak için çağırmak __ sihirli yöntemini kullanın ve böylece bir geri uygulamak merak ediyordum

PHP 5.3 için böyle bir şey, ses

interface Callback 
{
    public function __invoke(); 
}

class MyCallback implements Callback
{
    private function sayHello () { echo "Hello"; }
    public function __invoke ()  { $this->sayHello(); } 
}

class MySecondCallback implements Callback
{
    private function sayThere () { echo "World"; }
    public function __invoke ()  { $this->sayThere(); }
}

class WhatToPrint
{
    protected $callbacks = array();
    public function register (Callback $callback) 
    {
        $this->callbacks[] = $callback;
        return $this;
    }
    public function saySomething ()
    {
        foreach ($this->callbacks as $callback) $callback(); 
    }
}

$first_callback = new MyCallback;
$second_callback = new MySecondCallback;
$wrapper = new WhatToPrint;
$wrapper->register($first_callback)->register($second_callback)->saySomething();

HelloWorld basacaktır

Bu yardım umuyoruz ;)

Ama ben böyle bir özellik için SPL ile Kontrol deseni tercih ediyorum.