Como integrar desarrollos en PHP sobre .NET Framework

 

Fecha: 19/Jul/2005 (16/07/2005)
Autor: Axel Strembel - axel@axel.com.ar

 


Una de las características más importantes del Framework .NET es la capacidad de soportar gran cantidad de lenguajes de programación, tanto viejos como recientes.
Existen actualmente muchos compiladores para distintos lenguajes que trabajan generando código intermedio MSIL para el Framework .NET, y además, en la comunidad de desarrollo, muchos programadores PHP.

Se han generado varias implementaciones de PHP para lograr la interacción con el Framework, pero la que más me ha llamado la atención es una llamada Phalanger. (http://www.php-compiler.net).

Phalanger provee a los desarrolladores de aplicaciones web la posibilidad de contar con los beneficios de la efectividad del lenguaje PHP y el poder y riqueza de la plataforma .NET.

Dicho de otra manera, permite el uso de una clase escrita en PHP desde una aplicacion .NET o importar desde PHP una clase escrita en C# o Visual Basic .NET.

No nos olvidemos de un detalle; la compilación de scripts PHP, brinda aún más poder de ejecución a las aplicaciones desarrolladas en este lenguaje.

También, pueden desarrollarse aplicaciones de consola, o librerías dll, reutilizables desde cualquier aplicación .NET

Otros de los detalles de este producto es que posibilita desarrollar dichas aplicaciones en PHP directamente desde Visual Studio .NET 2003, creando un tipo de proyecto personalizado, y permitiendo, además, la compilación y depuración del código escrito.

Y, a mi entender, la característica más importante de Phalanger, es que es de uso libre.

El propósito de este artículo es hacer que los actuales desarrolladores, tanto de PHP como de .NET conozcan la posibilidad de integración de las tecnologías, de una manera simple y muy poderosa.

 

Vamos a realizar el ejemplo.

Lo primero que debe hacerse, es bajar el instalador de Phalanger desde http://www.php-compiler.net
El instalador, consta de:

Microsoft .NET Framework 1.1
Phalanger and IIS Integration
Visual Studio Integration Partnet Package
Visual Studio .NET 2003 Integration

Luego de instalar lo necesario ya estamos en condiciones de comenzar a desarrollar en PHP sobre .NET Framework.

Vamos a generar un ejemplo muy sencillo de utilización de una clase PHP sobre una página ASPX escrita en C#.

Desde Visual Studio .NET 2003, creamos una solución en blanco.
Agregamos a la solución un proyecto del tipo Phalanger Project, el cual llamaremos "PHPClasses".

En las propiedades del proyecto, especificaremos el nombre para el Assembly (en nuestro caso, lo llamaremos "PHPClasses", para no confundirnos.)

Podemos especificar, además, el "Output path" para nuestra dll, en caso que querramos generarla en otro directorio que no sea el del proyecto.

Lo más importante a tener en cuenta en este paso, es el tipo de assembly a generar, ya que necesitaremos que sea una "Class library" para poder referenciarla desde nuestra aplicacion ASP.NET.

Vamos a agregar ahora un elemento al proyecto, del tipo "Source File" (nótese que Phalanger nos deja generar dos tipos, "Source File" y "Html File", que están de más aclarar).

Una vez que especificamos el nuevo archivo a crear (Yo lo llame Classes.php), ya podemos demostrar todos nuestros conocimientos de PHP.

Para no complicar la situación, solo vamos a generar una clase simple a utilizar desde ASP.NET.

	<?php
		class UnaClase{
			
			public $propiedad = null;
			
			public function UnaClase()
			{
				$this->propiedad = "Valor por defecto";
			}
			
			public function CargarPropiedad($parametro = ""){
			   $this->propiedad = $parametro;
			}	
			
			public function LeerPropiedad()
			{
				return $this->propiedad;
			}
		}
	?>
	

Si hacemos click derecho sobre el proyecto, podemos compilarlo, generando de esta manera, la DLL "PHPClasses" que habíamos especificado antes.

Ahora podemos agregar una aplicación ASP.NET, la cual llamaremos "TestPHP".
Antes de comenzar a utilizar la clase esrita anteriormente, tenemos que hacer algunas cosas.

Primero, referenciaremos a la DLL creada (Click derecho sobre el proyecto -> Add Reference ó Agregar Referencia -> Browse ó Examinar -> Buscar la DLL en el directorio por default, o el que hayamos indicado en las propiedades del proyecto Phalanger)

Bien, ya tenemos todo lo necesario.

En la Web Page que Visual Studio nos creó, vamos a escribir unas lineas de código.

Para comenzar, vamos a especificar los namespaces necesarios para instanciar nuestra clase PHP.

    using PHP.User.Classes;
    

Puede verse que todas las clases que creamos dentro de nuestro assembly escrito en PHP van a estar dentro del namespace PHP.User

 

Bien, ahora en el método Load de nuestra página ASP.NET vamos a crear el objeto.

    UnaClase miObjeto = new UnaClase();
    

 

Ejecutamos el método LeerPropiedad() de la clase PHP para ver lo que tenemos cuando la instanciamos, mostrando la salida

    string propiedad = (string)miObjeto.LeerPropiedad();
    Response.Write("El valor de la propiedad al instanciar la clase es: " + propiedad + "<br/>");
		

Aqui vemos que la comunicacion entre .NET y PHP la vamos a tener que hacer mediante objetos del tipo object, y por eso, debemos hacer el cast explicito para poder guardar el resultado en un string.

Ya que estamos, vamos a alterar el contenido del objeto que creamos, modificando la propiedad "propiedad" de la clase, mediante el método CargarPropiedad() que definimos en el código PHP.
Luego mostramos la salida, haciendo la misma conversión para ver si efectivamente la clase acepto el cambio.

    miObjeto.CargarPropiedad("Hola");
    string propiedad_modificada = (string)miObjeto.LeerPropiedad();
    Response.Write("El valor de la propiedad luego de cambiarla es: " + propiedad_modificada + "<br/>");
    

 

Ya está, si todo esta correcto, tendría que funcionar de maravilla, pero cuando hacemos click en Generar de la solución vamos a ver un mensaje de error del compilador que nos aclara lo siguiente:


    La clase 'PHP.User.Classes.UnaClase' a la que se hace referencia tiene 
    una clase base o una interfaz 'PHP.Core.PhpObject' definida en un ensamblado 
    al que no se hace referencia. Debe agregar una referencia al ensamblado 'PhpNetCore'.
    

Está de más dar una explicación a ésto, ya que Phalanger y Visual Studio, nos dieron todas las pistas para resolverlo, pero vamos a hacerlo de todos modos.
Para lograr hacer la comunicación, todos los PHP compilados con Phalanger, tienen referencia interna a un assembly que se ha agregado al GAC durante el proceso de instalación.
Para que nosotros desde .NET podamos hacer referencia e instanciar las clases de PHP, vamos a tener que agregar la referencia a éste assembly el cual se llama "Phalanger Core".

Una vez que esté agregada la referencia, podemos intentar compilar nuevamente.

Ahora podemos abrir la pagina ASP.NET compilada y nuestro resultado será el siguiente:


    El valor de la propiedad al instanciar la clase es: Valor por defecto
    El valor de la propiedad luego de cambiarla es: Hola
    

La comunicación se logro de maravilla.

Para los que estén interesados en ésta "melange" de tecnología, Phalanger tiene además, una gran cantidad de ejemplos que se copian durante la instalación, como aplicaciones de consola, utilización de librerias como GTK, Exif, ZLib y muchas más.

Gracias por el tiempo.
Espero que les haya gustado este artículo.

Saludos a todos.

Axel


Espacios de nombres usados en el código de este artículo:

System;
System.Collections;
System.ComponentModel;
System.Data;
System.Drawing;
System.Web;
System.Web.SessionState;
System.Web.UI;
System.Web.UI.WebControls;
System.Web.UI.HtmlControls;
PHP.User.Classes;


ir al índice