Vamos a demostrar como los conceptos básicos que usted ha aprendido con Processing (variables, condicionales, bucles, funciones, objetos, lista) se extiende a la programación en otros lenguajes.
Veremos como hay ciertos tipos de tareas que usted puede alojar en scripts en el lado del servidor, escritos en lenguaje PHP, que no pueden ser realizadas fácilmente dentro de su código de Processing en si mismo.
Este tutorial esta basado en material de Shawn: PHP rápido y sucio PHP
y Dano: código de ejemplo PHP.
PHP se refiere a "PreProcesador de Hipertexto") es un lenguaje para hacer scripts diseñado para crear paginas de Internet dinámicas. Que significa para una página de Internet el ser dinámica? Si usted esta familiarizado con HTML básico, usted sabe que se puede "marcar" una página de Internet para que tenga un formato específico con una estructura de etiquetas. Algo como:
<html>
<head>
<title>Your Page's Title</title>
</head>
<body>
The <strong>content</strong> of your <em>web page</em>.
</body>
</html>
Lo clave para darse cuenta acá es que no importa cuantas veces usted presione el botón de refrescar, esta página de Internet nunca variara.
Es completamente estática (algunas veces referidas como html "plano").
Mediante la introducción de datos y lógica (Ej. programación) en una página Web (usando PHP ), usted puede crear páginas de Internet que se vean diferentes basadas en algún conjunto de datos de entrada (una base de datos, lo que un usuario ingrese en un formulario, números aleatorios, etc.).
Para integrar PHP adentro de una página html, se debe hacer lo siguiente:
Estar seguro de que su servidor web da soporte a PHP.
Crear un archivo con extensión PHP, Ej. “index.php” o “mipagina.php”
Escribir HTML normalmente, pero incluir cualquier código PHP adentro de:<? ACA VA PHP ?>
Acá se presenta un ejemplo de una página PHP que muestra un número aleatorio que se encuentra entre 0 y 10 cada vez que usted recarga la página:
<html>
<head>
<title>Random number between 0 and 10</title>
</head>
<body>
A random number: <? echo rand(0,10); ?>
</body>
</html>
Observe como esto se ve idéntico a nuestro html "plano" con una excepción: <? echo rand(0,10); ?> en medio de “<?” y de “?>” se encuentra el código PHP. "echo" significa imprimir, Ej. queremos ver lo que sea que venga después del hecho en el navegador. rand(0,10) es un llamado a la función que retorna un número aleatorio que se encuentra entre 0 y 10.
Esto no es diferente a la función random() en Processing.
La documentación para esta función se puede encontrar en
Ahora que tenemos una idea básica de porque existe PHP en principio y como integramos código PHP en una página de Internet, podemos llegar al momento en el que vemos que todas esas cosas de fundamentos de programación que aprendimos con Processing también aplica para PHP (y casi todos los lenguajes de programación)
En el ejemplo de abajo, observe como "//" también indica una línea de comentario en PHP.
Variables
A diferencia con Processing:
Todas las variables en PHP deben comenzar con un símbolo de dólar: $
PHP no requiere que usted declare un tipo de dato para su variable!
Ejemplo:
// Declarando e inicializando variables (no se necesita especificar el tipo de dato!!)
$x = 5;
$xspeed = 4.23;
$x = $x + $xspeed;
echo $x;
// Dos Cadenas de caracteres
$name = "Zoog";
$title = "Cosmonaut";
echo $title . " " . $name;
También, observe como en el código de arriba un punto ‘.’ es usado para concatenar dos cadenas de caracteres.
En Java y Processing es usado el operador de suma ‘+’ .
Condicionales
Los condicionales (if, else if, else) son exactamente igual que en Processing! $x = rand(0,10);
// Condicionales básicos en PHP
if ($x > 5) {
echo $x . " es mayor que 5";
} else {
echo $x . " es menor o igual que 5";
}
Bucles
Los bucles (tipo "for", tipo "while") son exactamente iguales que en Processing!
// Bucle en PHP
for ($i = 0; $i < 10; $i++) {
echo $i;
}
Listas
Hay varios tipos de diferencias en como las listas funcionan en PHP:
No se necesita especificar el tipo de dato de una lista.
Usted no tiene que declarar explícitamente el tamaño de una lista por adelantado!. Esto hace especialmente fácil la adición de elementos al final de la lista.
PHP permite una sintaxis especial “para cada uno” para que se haga bucle a lo largo de una lista.
PHP permite algo llamado lista asociativa ("associative array"). Una lista asociativa es una lista de valores en donde cada uno es referenciado por una "llave" (Cadena de caracteres) a cambio de un índice (número entero). En otras palabras, en lugar de enumerar los elementos en su lista de 0 a 9 (10 elementos en total), usted puedenombrar los elementos de su lista. El elemento de lista "fred", elemento de lista "sue", elemento de lista "bob", etc. Hay ciertas instancias donde esto es especialmente conveniente. Note que usted puede hacer esto en Processing también, mediante el uso de MapadeHashing.
Usted puede obtener el tamaño de una lisa con la función sizeof()
Acá hay un código PHP de ejemplo sobre listas que cubre los ítems mencionados arriba:
// Creando una lista
$nameList = array("Joe","Jane","Bob","Sue");
echo $nameList[2];
// Adicionando un elemento al final de esa lista
$nameList[] = "Zoog";
echo $nameList[4];
echo "<br><br>";
// Crear una lista con un bucle
for ($i = 0; $i < 10; $i++) {
$nums[$i] = rand(0,10);
}
// Usando la sintaxis foreach, para cada uno
foreach ($nums as $value) {
echo $value . " " ;
}
// Obteniendo el tamaño de una lista
echo "<br><br>The size of the array is " . sizeof($nums);
// Una lista asociativa
$studentIDs["Joe"] = 23;
$studentIDs["Jane"] = 41;
Funciones
Usted puede escribir sus propias funciones en PHP:
// Definiendo una función
function printDate() {
echo "The Date and Time is: ";
$today = date(DATE_RFC822);
echo $today;
}
Objetos
Usted también puede escribir clases y hacer objetos en PHP, con algunas diferencias:
Las variables deben estar declaradas como publicas o privadas
la función constructora siempre se nombra así: “__construct”
Las variables instanciadas necesitan ser referidas como: “$this->varname”.
// Definiendo una clase
class Human {
// Declarando variables de instancia
public $firstname = "default";
public $height = 0;
// Escribiendo una función constructora
function __construct($n) {
// Note el uso de $this->varname
$this->firstname = $n;
$this->height = rand(5,6);
}
// Una función
function show() {
echo "<br><br>" . $this->firstname . " is " . $this->height . " feet tall.";
}
}
Crear un objeto e invocar sus métodos es fácil, la única diferencia es el uso de la sintaxis “->” — Ej. object->function() — en lugar de lo que se estamos acostumbrados en java:
object.function().
// Creando un objeto
$frank = new Human("Frank");
// Llamando la función del objeto
$frank->show();
PHP y formularios
Un uso muy común para PHP es el de recibir datos de un formulario y generar una salida de datos (output) de acuerdo a esos datos. Veamos un ejemplo de formulario html:form.html
<html>
<head>
<title>A Simple HTML Form</title>
</head>
<body>
<form action="getform.php" type="get">
Name: <input type="text" name="name"><br>
Mood:
<select name="mood">
<option value="sad">Sad</option>
<option value="happy">Happy</option>
</select>
<br>
<input type="submit" value="Submit Me">
</form>
</body>
</html>
Note como el atributo "action" del formulario se define como "getform.php". Esto significa que cuando el usuario haga clic en el botón de envío del formulario, los datos se van a enviar mediante una petición HTTP Get. PHP puede entonces preguntar por esos datos usando la variable nativa del lenguaje: $_GET. $_GET es técnicamente un arreglo asociativo, y los valores pueden ser extraídos reverenciándolos a los nombres de entrada de datos (input) del formulario Ej.: $name = $_GET["name"];
Aquí hay un ejemplo donde el HTML resultante depende de las entrada de datos del formulario: getform.php, código fuente: getform.php.txt.
<html>
<head>
<title>The Form Output</title>
</head>
<body>
<?
// Obtener las cosas ingresadas en un formulario
$name = $_GET["name"];
$mood = $_GET["mood"];
echo $name . ", ";
// Basado en lo que se ha seleccionado en el formulario, escoja una salid de datos (output)
if ($mood == "happy") {
echo " I am jealous of your happiness.";
} else {
echo " why so glum?";
}
?>
</body>
</html>
Estos datos no tienen que venir de un formulario HTML. Si usted mira de cerca en la barra de URL del navegador, se dará cuenta de que se ve así:
http://www.learningprocessing.com/php/getform.php?name=Fred&mood=happy
Usted puede manipular la cadena de caracteres de búsqueda usted mismo (acostumbrarse a eso es importante porque cuando entremos en la integración dePHP con Processing , usted necesitara crear la cadena de caracteres de búsqueda sin un formulario de Internet). La sintaxis para cadenas de caracteres de búsquedaURL es:
mypage.php?name1=value1&name2=value2&name3=value3
Una de las mejores cosas para las cuales podemos usar PHP es para persistencia (guardar información). Puesto que los scripts PHP son ejecutados en el servidor (opuesto a un applet de Processing, el cual se ejecuta en el lado del cliente), puede leer y escribir datos directamente a y desde el servidor de una forma relativamente fácil. La primera cosa que necesitamos hacer es encontrar funciones nativas de PHP que nos permitan leer y escribir a un archivo. Todas las funciones nativas de PHP que están disponibles a usted (hemos visto unas cuantas hasta ahora: date(), rand()) pueden ser encontradas buscando en php.net. Las funciones que necesitamos para Entrada/Salida de datos en archivos son:
fopen() — abre un archivo (o una URL). Cuando abra el archivo, usted deberá declarar sus intenciones, Ej. usted planea leer, escribir un nuevo archivo, adicionar información a un archivo viejo, etc. Para escribir en un archivo, usted pasa el parámetro: ‘w’, para adicionar: ‘a’, solo-lectura: ‘r’, etc.
fread() — retorna el contenido de un archivo
fwrite() — escribe contenido a un archivo
filesize() — retorna el tamaño de un archivo
fclose() — cierra un archivo (debe ser llamada cuando usted termine de leer o escribir)
Usando las funciones nativas anteriores, podemos escribir una función genérica para escribir en un archivo:
// función para escribir en un archivo
function writeData($filename,$content){
$dest = fopen("$filename", 'w') ;
fwrite ($dest,$content);
fclose($dest);
}
Y una para leer de un archivo:
// función para leer de un archivo
function getData($filename){
$size = filesize ($filename);
$src = fopen ($filename, 'r');
$content = fread ($src,$size);
fclose ($src);
return $content;
}
Entonces, tomemos una situación simple donde nuestro archivo de texto se ve así: data.txt.
0,1
Recreemos el ejemplo 5-6: Bola rebotando, solamente que en lugar de un applet de Java, vamos a tener una página de Internet simple con una letra X. Cada vez que la página se refresca, el script PHP lee los dos números desde el archivo de texto y posiciona la "X" respectivamente — el primer numero es su posición horizontal y el segundo número es su dirección de movimiento. Acá están nuestros pasos, de la mano con el código:
1. Lea los datos de el archivo: $content = getData("data.txt");
2. PHP también tiene una función split() para romper una cadena de caracteres y ponerla adentro de una lista:
$vals = split(",",$content);
$x = $vals[0];
$dir = $vals[1];
Note como no tenemos que hacer ninguna conversión de cadena de caracteres a número entero en PHP!
3. Mueva la letra y muéstrela:
$x += $dir;
if ($x > 5 || $x <= 0){
$dir *= -1;
}
for($i = 0; $i < $x; $i++){
echo " "; // un espacio en blanco
}
echo "X";
4. Escriba nuevos datos de regreso al archivo:
writeData("data.txt","$x,$dir");
Note acá como podemos ubicar variables directamente en una cadena de caracteres (entre comillas dobles). De hecho no necesitamos concatenar una cadena de caracteres con "."!!
Acá esta el script PHP en acción: rebote.php y el código: rebote.php.txt.
Una palabra por precaución: cualquiera puede acceder y modificar los datos en el servidor mediante get. Cualquier cosa que sea pasada a PHP vía cadena de caracteres de búsqueda de URL deja abierta la posibilidad para causar daños y usted debe tomar las precauciones apropiadas, tales como limitar las lecturas/escrituras de datos a los archivos en ciertos directorios, etc.
La misma técnica que usamos para persistencia de una refrescada a otra de una página de Internet puede ser usada con un sketch de Processing (con loadStrings() reemplazando el navegador de Internet). Consideremos un script PHP que puede hacer tres cosas:
Leer de un archivo de texto y escribir contenido
Adicionar una coordenada (x,y) a un archivo de texto.
Limpiar el archivo de texto de todo su contenido.
Lo primero que queremos hacer es estructurar nuestro script PHP para recibir una orden en la forma de búsqueda URL, Ej. estas tres búsquedas van a resultar en una acción diferente:
loadstrings.php?type=load
loadstrings.php?type=save&x=100&y=100
loadstrings.php?type=clear
Podemos estructurar el script PHP para tener una condicional simple basada en el valor de "type". En el código de abajo, primero verificamos para ver si el tipo ha sido pasado mediante la cadena de caracteres de búsqueda o si no. Podemos preguntar si $_GET['type'] "esta listo," usando la función isset().
if (isset($_GET['type'])) {
$type = $_GET['type'];
} else {
$type = "null";
}
Ahora, basado en el valor de $type, podemos ejecutar diferentes operaciones:
if ($type == "save") {
// EL CODIGO DE SALVAR VA ACA
} else if ($type == "clear") {
// EL CODIGO DE LIMPIAR VA ACA
} else if ($type == "load") {
// CODIGO DE CARGAR VA ACA
} else {
echo "This PHP script requires a query string!";
}
Processing puede entonces usar loadStrings() para pedirle al script PHP que realice varias acciones. Por ejemplo, salvar una coordenada cuando se el ratón ha sido activado:
void mousePressed() {
String[] lines = loadStrings("http://www.learningprocessing.com/php/loadstrings.php?type=save&x=" + mouseX + "&y="+mouseY);
}
O limpiar el archivo cuando una tecla sea presionada:
void keyPressed() {
String[] lines = loadStrings("http://www.learningprocessing.com/php/loadstrings.php?type=clear");
}
Y, por supuesto, cargar el texto actual en el archivo y dibujando algo basado en los datos de ese archivo:
String[] lines = loadStrings("http://www.learningprocessing.com/php/loadstrings.php?type=load");
for (int i = 0; i < lines.length; i++) {
int[] vals = int(split(lines[i],","));
rectMode(CENTER);
stroke(0);
fill(175);
rect(vals[0],vals[1],10,10);
}