在现代Web开发中,经常需要在现有的PHP网站中集成C#代码,或者将PHP代码迁移到C#。本文将展示如何通过Phalanger和ASP.NET实现PHP与C#的无缝互操作性。
想象一下以下几种使用场景:
1. 有一个由许多.php脚本组成的PHP网站,想要扩展其功能或者完全将其后端重写为C#。希望能够像往常一样,将C#代码写入特殊的App_Code文件夹中。
2. 已经有一个ASP.NET网站,并且打算添加一些PHP脚本,因为这对于程序员来说更容易,或者已经有了PHP的表示层。仍然需要在这些PHP脚本中使用现有的C#对象。
3. 有一个PHP网站,并且打算慢慢迁移到C#。需要逐步将PHP代码的关键部分重写为C#,而网站的其他部分仍然使用PHP。这个混合网站在迁移过程中需要正常工作。
所有这些场景都有一个共同的架构:网站上到处都是.php脚本,而.cs脚本位于App_Code文件夹中。希望能够在PHP代码中无缝地使用所有的C#方法和类,反之亦然。
在Phalanger 3.0发布之前,需要在分离的类库项目中编写C#代码,将其编译成程序集,并将引用添加到web.config文件中。这个过程仍在使用,但它使得开发速度比应有的速度慢了一些。
现在,这个过程由ASP.NET和Phalanger一起处理。不需要配置任何东西,事情就会如预期那样工作。
任何在.NET语言中编写的公共类,放置在App_Code文件夹中的脚本,都可以在PHP代码中无缝地使用标准PHP语法。
在这里创建了一个简单的演示:
App_Code互操作性。这个演示由一个PHP页面组成,包含表示层,使用C#编写的Class1。注意这里没有配置链接这两个世界,事情就像在任何其他ASP.NET网站中预期的那样工作。
这个演示利用了Phalanger和ASP.NET的几个特性。
Web应用程序记住了最后一次请求的文本和请求的数量。这要归功于ASP.NETAppPool实例中的(真正的)静态变量。这种技术可以用来实现非常有效的内存中缓存。
PHP脚本自动编译成.NET程序集,并且如果它们发生变化,会自动重新编译。
应用程序的后端可以很容易地用C#编写,或者部分用C#编写。通过这种方式,可以在C#中有效地实现Web应用程序的关键部分,同时保留现有的PHP代码。
最后,App_Code文件夹中的C#代码在PHP代码中自动可见,包括命名空间、常量、属性和方法。
上面的代码展示了简单的用法,无缝地在PHP代码中使用C#类。它看起来并不像是使用了任何.NET类,然而Class1是用C#编写的。它从App_Code文件夹自动加载。
<?php
$x = new Class1;
$growncamel = $x->MakeCamelFromGet();
$x->Camel($_GET['babycamel']);
if ($growncamel):
?>
<h2>
<?= $growncamel ?>
</h2>
<?php endif; ?>
这段代码展示了如何在PHP代码中无缝地使用C#类。它看起来并不像是使用了任何.NET类,然而Class1是用C#编写的。它从App_Code文件夹自动加载。
App_Code文件夹利用了ASP.NET自动预编译特殊/App_Code文件夹中的所有代码。生成的程序集放置在HttpRuntime.CodegenDir(临时ASP.NET文件)中。程序集名称可以在XML文件"App_Code.compiled"中找到,位于XML元素preserve的attribute assembly中(如果没有不同配置的话)。
Phalanger本身以前就能够引用.NET程序集。然而现在它会自动加载App_Code程序集,无需其他配置和编译。