Phalanger: PHP para .NET

Phalanger es un compilador escrito en C#, para poder compilar PHP en MSIL. Phalanger tiene soporte para la versión 5.x de PHP, por lo cual podremos hacer uso de las funcionalidades de la Programación Orientada a Objetos.

Entre las características más remarcables a mencionar de Phalanger y que serían los motivos para usarlo en contra de PHP nativo, sería que se tiene acceso a todas las clases de .NET escritas para C#, en otras palabras interoperabilidad simplificada con lenguajes .NET y el uso de un compilador Just in-Time en vez de un intérprete, lo cual significa un aumento de velocidad considerable. (http://www.php-compiler.net/benchmarks)
El proyecto es OpenSource, por lo que pueden bajar los binarios o el código fuente de Codeplex (http://phalanger.codeplex.com/); el instalador es bastante intuitivo y se encarga de casi el 100% de las configuraciones necesarias para que podamos crear soluciones con este producto.
El soporte de Phalanger para Visual Studio es bueno, no como para otros lenguajes, pero lo suficiente como para que podamos desarrollar de una manera cómoda. Para mostrarles cómo funciona voy a crear una aplicación simple de prueba en modo consola.
Nuestro primer paso consiste en crear un proyecto del tipo Phalanger Console Application, al que lo nombraremos Test2:


Nuestro siguiente paso será crear 2 funciones, una llamada WriteInstanceFunction y otra llamada WriteStaticFunction, como sus nombres indican una función será del tipo estática y la otra del tipo de Instancia:
             function WriteIntanceFunction()
             {
                    echo "Hello From an Instance Function\n";
             }
             static function WriteStaticFunction()
             {
                    echo "Hello From a Static Function\n";
             }
 El siguiente paso sera llamar a esas funciones dentro de nuestro metodo Main:
             static function Main()
             {
                    echo "Welcome to Phalanger!\n";
                    //Creating an Object of type Program
                    $p=new Program();
                    //Calling the method WriteInstanceFunction
                    $p->WriteIntanceFunction();
                    //Calling an Static Function form Class Program
                    Program::WriteStaticFunction();
                    fgets(STDIN);
                    return 0;
             }
Si hacemos correr el Código podremos ver los mensajes en una ventana de consola, como se muestra a continuación:

Si analizamos el código de arriba, veremos primero que a diferencia de otros lenguajes .NET, para obtener la instancia de un objeto no debemos de declarar una variable de la forma "Type VaribleName;", luego como segundo punto tenemos que para acceder a los métodos de un objeto, usaremos el operador "->" en vez del  "."; después podemos ver que para acceder a métodos estáticos de una clase usamos el operador "::", y por ultimo tenemos que para realizar una lectura de datos desde consola estamos usando el método "fgets(STDIN);".
Con lo anterior ya sabemos crear una aplicación simple de consola en un solo archivo, pero que pasa cuando deseamos crear una aplicación más  grande que requiere ser escrita en múltiples archivos?, para cubrir ese caso vamos a crear una clase llamada "Person", que va a estar en un archivo aparte. Nuestro primer paso será agregar un nuevo archivo:
Este archivo solo viene con un constructor, por lo cual vamos a agregar un Atributo llamado "Name" junto con sus respectivos métodos de acceso:

       namespace Test2 {
             class Person {
                    var $name;
                    public function __construct() {
                           $this->name="A Name";
                    }

                    function SetName($_name)
                    {
                           $this->name=$_name;
                    }

                    function GetName()
                    {
                           return $this->name;
                    }
             }   
       }

Como vemos en el código la clase es bastante sencilla donde los únicos 2 puntos a destacar serian, que primero nuestra clase esta englobada en un espacio de nombres (namespace Test2) y segundo que para que los objetos instanciados de esta clase funcionen correctamente (que las operaciones get y set se lleven a cabo de la forma esperada) debernos manipular el artibuto name, junto a la palabra clave this, de la siguiente forma "$this->NombreAtributo".
Como siguiente paso en nuestra clase Program, agregaremos las siguientes líneas debajo la llamada a la función estática WriteStaticFunction:

            $persona=new Test2\Person();
            $temp="Mr. Coffee";
            $persona->SetName($temp);
            echo "Hello " . $persona->GetName();

Y después agregaremos la sentencia "use Test2;" como primera sentencia después de la línea <? php. Si hacemos correr la aplicación, veremos lo siguiente:



Analizando los cambios hechos, tenemos 2 cosas nuevas, la primera es que para importar un espacio de nombres hemos usado la palabra reservada "use" seguida del nombre de espacio que deseamos importar y como segundo punto tenemos que a persar de haber importado el espacio de nombres y de que la clase pertenece a la misma aplicacion debemos usar la siguiente sintaxis para poder usar una clase ubicada en otro archivo que pertenesca a cierto espacio de nombres: "NameSpace\Class".
Como una observación extra les indico que si quitamos el espacio de nombres del archivo que contiene la clase Person, se puede crear el objeto sin usar la sintaxis anteriormente explicada.
Para finalizar el presente post vamos a ver cómo usar un par de funcionalidades de .NET, que son los métodos WriteLine y ReadLine de la Clase Console, para lo cual vamos a incluir el espacio de nombres "System" y despues vamos a agregar el siguiente código a nuestro Main:
                    System\Console::Write("Insert Your Name: ");
                    $temp=System\Console::ReadLine();

Si lo ejecutamos tendremos lo siguiente: 

Espero que les sea de ayuda este post. Suerte!

1 comentarios:

se puede conceatar phalanger con sqlserver?

Reply

Publicar un comentario