<p><strong>为了 Linq 诊所</strong></p> <p>如果你想在 LINQ 上做一些练习,包括练习和答案,非常容易设置,在我看来,非常棒:</p> 如何在 PHP 中实现回调?

Https://github.com/walkhard/linq-exercises

从 git 下载,在 VisualStudio 中打开。您的工作是使测试通过。

如何用 PHP 编写回调?

134357 次浏览

显示: 数据是: 这是我的数据

如何启动一个进程,例如当用户单击按钮时启动 URL?

我最近发现的一个巧妙的技巧是使用 PHP 的 create_function()创建一个匿名/lambda 函数,以便一次性使用。它对于像 array_map()preg_replace_callback()usort()这样使用回调进行自定义处理的 PHP 函数非常有用。它看起来非常像一个 eval(),但它仍然是一个很好的函数风格的 PHP 使用方式。

不幸的是,当创建命名函数时,这是唯一的选择,不值得这么麻烦。

这将使用已加载的 Text.Txt 启动 Notepad.exe。

正如 Matt Hamilton 所建议的那样,对过程进行有限控制的快速方法是在 System 上使用静态 Start 方法。诊断。程序课。

using System.Diagnostics;
...
Process.Start("process.exe");
Ss 包括调度,运行它的窗口的类型,以及对我来说最有用的,等待进程结束的能力。

using System.Diagnostics;
...
Process process = new Process();
// Configure the process using the StartInfo properties.
process.StartInfo.FileName = "process.exe";
process.StartInfo.Arguments = "-n";
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
process.Start();
process.WaitForExit();// Waits here for the process to exit.

这种方法允许比我提到的更多的控制。

您需要验证您的调用是否有效。例如,在特定函数的情况下,您需要检查函数是否存在:

function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
  • 遗留的 create_function()创建一个全局函数并返回其名称。它是 eval()的包装器,应该使用匿名函数。
  • 包括 using System.Diagnostics;

    然后把这个叫做 Process.Start("Paste your URL string here!");

    create_function在一个类中对我不起作用。我必须使用 call_user_func

    <?php
    
    
    class Dispatcher {
    //Added explicit callback declaration.
    var $callback;
    
    
    public function Dispatcher( $callback ){
    $this->callback = $callback;
    }
    
    
    public function asynchronous_method(){
    //do asynch stuff, like fwrite...then, fire callback.
    if ( isset( $this->callback ) ) {
    if (function_exists( $this->callback )) call_user_func( $this->callback, "File done!" );
    }
    }
    
    
    }
    

    试试这样:

    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Diagnostics;
    
    
    namespace btnproce
    {
    public partial class WebForm1 : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    
    
    }
    
    
    protected void Button1_Click(object sender, EventArgs e)
    {
    string t ="Balotelli";
    Process.Start("http://google.com/search?q=" + t);
    }
    }
    }
    

    然后,使用:

    <?php
    include_once('Dispatcher.php');
    $d = new Dispatcher( 'do_callback' );
    $d->asynchronous_method();
    
    
    function do_callback( $data ){
    print 'Data is: ' .  $data .  "\n";
    }
    ?>
    

    请注意,这是一个示例 ASP.NET 页面作为一个例子。你应该尝试和即兴一点点。

    [编辑] 添加了一个缺失的括号。 Do _ callback ($data){ 另外,添加了回调声明,我更喜欢这种方式。

    打印“ Data is:”. $Data. “ n”;

    使用 PHP 5.3,您现在可以这样做:

    function doIt($callback) { $callback(); }
    
    
    doIt(function() {
    // this will be done
    });
    
    }

    最后是一个不错的方法,对 PHP 来说是一个很好的补充,因为回调非常棒。

    对于那些不关心破坏与 PHP< 5.4兼容性的人,我建议使用类型提示来创建一个更清晰的实现。

    function call_with_hello_and_append_world( callable $callback )
    {
    // No need to check $closure because of the type hint
    return $callback( "hello" )."world";
    }
    
    
    function append_space( $string )
    {
    return $string." ";
    }
    
    
    $output1 = call_with_hello_and_append_world( function( $string ) { return $string." "; } );
    var_dump( $output1 ); // string(11) "hello world"
    
    
    $output2 = call_with_hello_and_append_world( "append_space" );
    var_dump( $output2 ); // string(11) "hello world"
    
    
    $old_lambda = create_function( '$string', 'return $string." ";' );
    $output3 = call_with_hello_and_append_world( $old_lambda );
    var_dump( $output3 ); // string(11) "hello world"