65.9K
CodeProject 正在变化。 阅读更多。
Home

“dynamic”关键字与 PHP 对象

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012年6月5日

CPOL

2分钟阅读

viewsIcon

7362

"dynamic" 关键字与 PHP 对象

我们已经演示了如何使用Phalanger在.NET应用程序中使用PHP脚本。作为参考,您可以查看PHP作为C#的脚本语言文章或标准模式互操作性教程。 这样,我们可以获取现有的PHP Web或库,将其加载到C#上下文中并重用其函数、类、常量或全局变量。 此外,我们甚至可以在C#中定义新的函数和类,并将它们注入到PHP中,以便PHP中的代码无缝地使用这些声明,就像它们也在PHP中声明一样。

编辑: Phalanger 3.0移除了下面提到的所有限制。

在这篇文章中,我想向您展示如何使用C# 4中引入的“dynamic”关键字,从C#环境中轻松重用在PHP代码中定义的对象。 由于Phalanger将PHP类转换为通用的.NET类型,因此使用起来非常直观。 但是有一个陷阱…

为了演示,我准备了一个加载PHP脚本的ASP.NET应用程序。 首先,它将PHP脚本加载到C#上下文中

context.Include("script.php", false);

这“运行”script.php,结果是context包含所有PHP声明。 此时,您可以查看context.DeclaredTypes,并列出声明的PHP类型。

现在,我们可以实例化一个PHP类型,并利用dynamic关键字。 以下语句实例化PHP类“X”,并将它的引用传递给C#动态变量

dynamic x = context.NewObject("X");

然后我们可以像往常一样调用X类的方法。 C#编译器在运行时自动实现多态内联缓存(就像我们在Phalanger编译器中使用的一样),以确定应该调用哪个方法并缓存调用,以便重复调用执行得更快。

var result = x.bar(context, 11);

您可能会注意到这里有一个额外的第一个参数,这是您应该记住的唯一陷阱。 Phalanger要求将当前的context作为每个方法调用的第一个参数传递。 它稍后在内部使用,主要用于提高运行时性能。

编辑: Phalanger 3.0不再要求传递context

限制 (Phalanger 2.1)

由于这是从C#上下文调用PHP方法的最快方法,因此会跳过PHP和.NET世界之间的一些内部转换。 这意味着您应该只传递PHP/Phalanger兼容的类型作为参数:intlongboolstringPHP.Core.PhpBytesPHP.Core.PhpArrayPHP.Core.Reflection.DObject(所有PHP对象的基类,因此允许任何其他PHP类实例)。

结论

在这篇文章中,我演示了如何在C#中使用“dynamic”关键字,以便您可以直观地在C#应用程序中使用您的PHP对象。 请下载附带的ASP.NET演示以查看其工作原理。 此外,Phalanger允许许多其他互操作方式,例如强类型鸭子类型

© . All rights reserved.