“dynamic”关键字与 PHP 对象





5.00/5 (1投票)
"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兼容的类型作为参数:int
、long
、bool
、string
、PHP.Core.PhpBytes
、PHP.Core.PhpArray
和PHP.Core.Reflection.DObject
(所有PHP对象的基类,因此允许任何其他PHP类实例)。
结论
在这篇文章中,我演示了如何在C#中使用“dynamic
”关键字,以便您可以直观地在C#应用程序中使用您的PHP对象。 请下载附带的ASP.NET演示以查看其工作原理。 此外,Phalanger允许许多其他互操作方式,例如强类型鸭子类型。