Funzioni anonime e closures in PHP 5.3

Fino ad oggi in PHP era possibile creare funzioni anonime (lambda) utilizzando la funzione create_function, ma il suo utilizzo non mi ha mai convinto, sapeva troppo di eval. Essendo abituato a Javascript, e a jQuery, trovo questa sintassi molto più funzionale:

var a = 5;
var myFunc = function (b) {
  return a + b;
};
a = 10;
alert( myFunc(2) ); //print 7

L’utilizzo di a all’interno di myFunc è chiamata closure: il valore di a viene bindato (legato) nello scope di myFunc, e rimarrà invariato nel tempo.

Dalla prossima versione di PHP, la 5.3, sarà possibile fare qualcosa del tutto simile. Ecco come:

$a = 5;
$myFunc = function ( $b ) use ( $a ) {
  return $a + $b;
};
$a = 10;
echo $myFunc( 2 ); // print 7

Notare che in PHP le closures vanno dichiarate esplicitamente con l’utilizzo del comando use.

Per quanto sia contento di questa nuova feature, rimango perplesso sulla linea con cui viene sviluppato ed aggiornato PHP: si prosegue con la mancanza di convenzioni, e a volte, come in questo caso, funzionalità nuove sanno più di patch che di improvement.

Sul sito di PHP trovate maggiori info, mentre in questo PDF sono elencate tutte le nuove features di PHP 5.3

Via: Zaemis

Tags: , , , , , , ,

Rotazione di immagini via jQuery

Proprio poco tempo fa, mi chiedevo quando sarebbe stato possibile gestire la rotazione di immagini in una pagina web, tramite l’utilizzo di Javascript e dei canvas HTML

Beh, ecco la risposta, un ulteriore tassello che credo permettera’ a breve la creazione di animazioni senza l’utilizzo di Flash.

Via: Ajaxian

Tags: , , ,

Portabilizzare la console di Firebug

Prima della versione 1.2 di Firebug, l’unico problema in cui gli sviluppatori Javascript si potevano imbattere nel suo utilizzo era la necessita’ di scrivere una funzione di inizializzazione della console.
Tale funzione aveva il compito di definire le funzioni della console nel caso la classica console.log e sorelle venissero eseguite in browser senza Firebug.

Nelle versioni di Firebug 1.2 e successive e’ stata introdotta la funzione loadFirebugConsole, senza la quale la console non parte. Questo richiede un refactoring della funzione di inizializzazione; gia’ che dovevo metterci le mani, ho pensato: perche’ non modificare la funzione in modo tale da poter usare le i metodi della console anche su Opera ed il suo tool di debugging, Dragonfly?

Detto fatto: Opera implementa una funzione simile alla console.log, chiamata opera.postError, che useremo per fare l’overload di tutti i metodi definiti nella console. Ecco il codice finale.

if ( typeof window.loadFirebugConsole == 'function' ) {
  window.loadFirebugConsole();
} else {
  if ( !(window.console && window.console.log) ) {
    if ( window.opera && window.opera.postError ) {
      fConsole = window.opera.postError;
    } else {
      fConsole = function() {};
    }
    window.console = {
      log:    fConsole,
      debug:  fConsole,
      info:   fConsole,
      warn:   fConsole,
      assert: fConsole
    }
  }
}

Ispirazione:
http://traviscline.com/blog/2008/04/02/firebug12-console-is-not-defined/
http://dev.opera.com/forums/topic/231622

Tags: , , , , ,

Come evitare che Javascript vi rallenti il browser

Uno dei problemi standard di chi si occupa di Javascript e’ quello relativo alla semplicita’ con cui un blocco di codice particolarmente dispendioso (in termini di tempo d’esecuzione e risorse) vi faccia freezare il browser per un tot di secondi.

Il problema e’ relativo al fatto che Javascript e’ un linguaggio single-threaded; in parole povere, mentre per esempio si eseguono cicli di istruzioni lunghe che si interfacciano con la struttura DOM di una pagina, il browser non trova una finestra di tempo dove poter fare un refresh del proprio contenuto, congelandosi.

Mi e’ capitato giustappunto oggi, dovendo lavorare sul DOM di una tabella piuttosto lunga, andando alla ricerca del posto esatto dove inserire nuove righe pervenutemi tramite Ajax.

Dato che il fulcro del progetto e’ proprio la prestazione dell’applicativo, sono subito andato alla ricerca di una possibile soluzione. Beh, ho scoperto un po’ di cose.

In questo articolo di debuggable.com viene proposta un’ottima soluzione (gia’ sperimentata e funzionante!) basata sull’inserire le nostre istruzioni ciuccia-risorse all’interno di una coda; ogni istruzione sara’ eseguita ed intervallata da un tot di millisecondi di pausa,

Qualcosa di simile e’ stato implementato anche in jQuery; ancora non mi sono documentato abbastanza, ma sembra una libreria, gestita direttamente dal core del framework, che si occupa di rendere il piu’ possibile smooth le animazioni.

Tags: , , , , ,

Javascript parser per PHP

Recentemente mi sono messo a cercare degli interpreti Javascript scritti in PHP.

Le ultime versioni dei browser eseguono senza problemi anche gli applicativi Javascript piu’ avanzati (chi si ricorda gli online desktop di un paio di anni fa?), senza contare che i vari framework JS sono sempre piu’ ottimizzati e veloci.

Tuttavia, volevo sondare quanto fosse possibile delegare parte della computazione Javascript, lasciandola al PHP e quindi al server.

Beh, i risultati sono sconsolanti; i parser che ho visionato sono lenti, elementari e ancora in fase beta.
Comunque sia, a scopo informativo, eccoli qui:

PHP-JS (utilizza il Mozilla SpiderMonkey)

J4P5

Tags: , , ,

Due modi semplici per testare le espressioni regolari

Il RegExp Evaluator di FirefoxSe siete stanchi di testare le vostre regular expression andando avanti a tentativi, ecco un paio di strumenti che possono fare al caso vostro.

Il primo, per gli utenti Linux, è KRegExpEditor, un semplice software in cui avete la possibilità di creare la regex in maniera semplice e veloce tramite la pulsantiera superiore, oppure scriverla alla vecchia maniera, down & dirty. Nell’area centrale inserite il testo sul quale volete testare la regex: si illuminerà a seconda della bontà della vostra espressione.

La seconda possibilità ve la fornisce invece Firefox: installate l’Extension Developer extension ed avrete a disposizione il RegExp Evaluator, uno strumento simile al precedente, sviluppato in Javascript. Ne trovate anche una versione online.

Se invece di espressioni regolari non avete mai capito (quasi) nulla, vi rimando al bellissimo regular-expressions.info!

Tags: , , , , ,