tag:blogger.com,1999:blog-12507380861204447102008-05-04T17:54:49.763+02:00phpElegantesoywiznoreply@blogger.comBlogger4125tag:blogger.com,1999:blog-1250738086120444710.post-34820613387708297882008-03-31T01:24:00.010+02:002008-04-02T13:13:38.649+02:00Usando y extendiendo PDO (I)PDO (PHP Data Objects) es una librería estándard disponible a partir de PHP5.0 como extensión PECL y en PHP5.1 como librería de serie que se puede usar para acceder a distintas bases de datos.<br /><br />Es un buen hábito usar los recursos del lenguaje sin dependencias adicionales, y en muchos servidores ya está disponible PHP5.2, así que disponer de PDO es bastante normal.<br /><br />PDO ofrece una interfaz orientada a objetos que se puede extender con facilidad.<br /><br />Existen numerosos ejemplos en internet sobre cómo usarla, así que no me extenderé en ello. Me centraré especialmente en cómo usar PDO para programar de forma sencilla y eficiente.<br /><br />PDO define dos clases: <span style="font-weight: bold;">PDO</span> y <span style="font-weight: bold;">PDOStatement</span>.<br /><br /><span style="font-weight: bold;font-size:130%;" >Acceder al objeto PDO</span><br /><br />Generalmente tendremos una única conexión con una base de datos y para acceder al objeto PDO de esa conexión desde cualquier sitio (incluido funciones) necesitaremos o bien una variable global o bien un campo estático con el objeto.<br /><br />Generalmente la gente suele optar por una variable global tipo $dblink o similares. Y para acceder a ella genéricamente desde una función o desde el ámbito global, necesitaremos acceder a ella con la superglobal $GLOBALS: $GLOBALS['dblink'] o explicitando su uso mediante el keyword global: global $dblink;<br /><br />Cualquiera de las dos soluciones es un poco engorrosa. Yo últimamente estoy usando la opción de campo estático y me está dando muy buenos resultados:<br /><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);">class </span><span style="color: rgb(0, 0, 187);">db </span><span style="color: rgb(0, 119, 0);">{<br /> static </span><span style="color: rgb(0, 0, 187);">$db</span><span style="color: rgb(0, 119, 0);">;<br />}<br /><br /></span></span></code>Para acceder al objeto PDO, bastaría con usar db::$db, que además de ser mas corto es mas fácil de escribir y tiene en parte un poco mas de sentido. Además usando la característica __autoload que ya he comentado, podemos hacer que se incluya a demanda la clase db y podemos hacer que en el fichero que esté definida la clase db, se encargue de hacer la conexión, de forma que mágicamente al acceder a db::$db obtendremos un objeto PDO con la conexión y si no, no se llegará a conectar (si no es necesario) y sin tener que estar con require_once o similares cada dos por tres.<br /><br />Además podemos usar la clase db para ciertas utilidades SQL. Es bastante habitual hacer inserts sencillos o updates que cambien una sola fila mediante un id y similares. Así que en class db. Me he puesto un par de métodos estáticos para generar queries de UPDATE e INSERT dada una tabla, un array asociativo y para el caso del UPDATE, una condición.<br /><br />En el caso del array asociativo del UPDATE tengo un caso especial que ocurre cuando el nombre de un campo empieza por '*', en cuyo caso el valor será una expresión (para cosas tipo NOW() y similares).<span style="font-weight: bold;font-size:130%;" ><br /></span>soywiznoreply@blogger.comtag:blogger.com,1999:blog-1250738086120444710.post-42828598922614358302008-03-31T01:04:00.011+02:002008-03-31T01:31:39.826+02:00php5.1 y spl_autoload_registerDesde <span style="font-weight: bold;">php5.1</span> disponemos de <span style="font-weight: bold;">spl_autoload_register</span> (desde <span style="font-weight: bold;">php5.0</span> podemos definir la función <span style="font-weight: bold;">__autoload</span>).<br /><br />En php5 si se define una función __autoload, ésta se llamará cada vez que se intente acceder a una clase que no exista. Tanto a un método estático como a la creación de un nuevo objeto de ese tipo.<br /><br />Ésto nos permite cargar código implícitamente y olvidarnos de incluir dependencias continuamente y permitiéndonos hacer algunas cosas mas lightweight sin tener que cargar cosas que no nos interesan.<br /><br />Aunque nos obliga a usar clases.<br /><br />Para agrupar funciones útiles que usemos comúnmente se puede hacer una clase "util" y luego métodos estáticos. Por ejemplo, yo suelo usar muy amenudo una función que llamo print_r_pre que se encarga de hacer lo mismo que un print_r, pero para que se vea correctamente en la web (usando <pre> y htmlspecialchars). Pues bien, me podría hacer una clase "util" con la función ahí:<br /><br /><pre><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);">class </span><span style="color: rgb(0, 0, 187);">util </span><span style="color: rgb(0, 119, 0);">{<br /> static function </span><span style="color: rgb(0, 0, 187);">print_r_pre</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$v</span><span style="color: rgb(0, 119, 0);">) {<br /> echo </span><span style="color: rgb(221, 0, 0);">'<>' <span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(0, 0, 187);">htmlspecialchars</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">print_r</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$v</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">true</span><span style="color: rgb(0, 119, 0);">)) . </span><span style="color: rgb(221, 0, 0);">'</span>< /pre>'</span><span style="color: rgb(0, 119, 0);">;<br /> }<br />}</span></span></pre>Lo metería, por ejemplo, en un fichero llamado <span style="font-weight: bold;">util.php</span> en una carpeta creada para usar con la característica __autoload. Por ejemplo: /core/classes/util.php<br /><br />Y luego en un fichero que sí que debería cargar cada vez algo tipo esto (suponiendo que el fichero que inclue este código esté en /core/):<br /><pre><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);">function </span><span style="color: rgb(0, 0, 187);">__autoload</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$class</span><span style="color: rgb(0, 119, 0);">) {<br /> if (!</span><span style="color: rgb(0, 0, 187);">file_exists</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$file </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">dirname</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">__FILE__</span><span style="color: rgb(0, 119, 0);">) . </span><span style="color: rgb(221, 0, 0);">'/classes/' </span><span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(0, 0, 187);">$class </span><span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(221, 0, 0);">'.php'</span><span style="color: rgb(0, 119, 0);">)) return;<br /> require_once(</span><span style="color: rgb(0, 0, 187);">$file</span><span style="color: rgb(0, 119, 0);">);<br />}</span></span></pre><span style="font-family: monospace;"><br /></span><span style="font-size:130%;"><span style="font-weight: bold;">Conclusión:</span></span><br />Si estás usando php5 y quieres ahorrarte mogollón de <span style="font-weight: bold;">requiere_once</span>. Las soluciones __autoload son para tí.soywiznoreply@blogger.comtag:blogger.com,1999:blog-1250738086120444710.post-71388117222340845072008-03-30T20:38:00.015+02:002008-03-31T02:39:52.231+02:00echo vs printf vs strtr/str_(i)replace vs preg_replace_callback<span style="font-weight: bold;font-size:130%;" >Introducción:</span><br /><br />En muchas ocasiones querremos separar el texto de nuestras páginas web de la programación propiamente dicho. En ocasiones será para poder localizar nuestra página (tenerla en diferentes idiomas), otras simplemente por comodidad.<br /><br />Dichos textos, generalmente estarán mezclados con contenido dinámico que se tendrá que reemplazar.<br /><div style="text-align: justify;"><br />Supongamos que tenemos una página con categorías y entradas de algún tipo y queremos mostrar en el título el camino a una subcategoría, y la cantidad de subcategorías y de elementos que tiene.<br /><br />Podríamos hacer algo similar a esto usando <span style="font-weight: bold;">echo</span>:<br /><span style="font-family:monospace;"><br /></span><div style="text-align: left;"><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);">echo </span><span style="color: rgb(0, 0, 187);">htmlspecialchars</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">'Categoría: ' </span><span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(0, 0, 187);">implode</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">' > '</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$path</span><span style="color: rgb(0, 119, 0);">) . </span><span style="color: rgb(221, 0, 0);">' Subcategorías: ' </span><span style="color: rgb(0, 119, 0);">. (int)</span><span style="color: rgb(0, 0, 187);">$categories_count </span><span style="color: rgb(0, 119, 0);">. </span><span style="color: rgb(221, 0, 0);">' Entradas: ' </span><span style="color: rgb(0, 119, 0);">. (int)</span><span style="color: rgb(0, 0, 187);">$entries_count</span><span style="color: rgb(0, 119, 0);">);</span></span></code><code></code><br /><code></code></div><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);"><br /></span></span></code></div><span style="font-size:85%;"><span style="font-family:courier new;"></span></span><div style="text-align: justify;">No es difíl darse cuenta de que, aunque funciona, es difícilmente actualizable; especialmente si la persona que tiene que retocarlo no sabe programar. Además si quisiesemos traducirlo a otros idiomas tendríamos que traducir cada parte individualmente (con el echo).<br /><br />Otra alternativa es usar la función printf, que permite crear una cadena de formato separada de los datos y nos permite una separación cómoda y eficiente; además de que facilita mucho todo lo referente a la localización de texto.<br /><br />Con <span style="font-weight: bold;">printf</span>, podríamos hacer algo similar a esto:<br /><br /><div style="text-align: left;"><span style="font-family:courier new;"><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" >define(</span><span style="color: rgb(221, 0, 0);font-size:100%;" >'TITLE_CATEGORY'</span><span style="color: rgb(0, 119, 0);font-size:100%;" >,</span><span style="color: rgb(221, 0, 0);font-size:100%;" >'Categoría: %s Subcategorías: %d Entradas: %d'</span><span style="color: rgb(0, 119, 0);font-size:100%;" >);</span></span></span></code></span><br /><span style="font-family:courier new;"><code></code></span><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);">printf</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">TITLE_CATEGORY</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">implode</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">' > '</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$path</span><span style="color: rgb(0, 119, 0);">), (int)</span><span style="color: rgb(0, 0, 187);">$categories_count</span><span style="color: rgb(0, 119, 0);">, (int)</span><span style="color: rgb(0, 0, 187);">$entries_count</span><span style="color: rgb(0, 119, 0);">));</span></span></code><br /></div><span style="font-family:monospace;"><br /></span></div><span style="font-family:courier new;"></span><div style="text-align: justify;">El define (o una posible variable global o clave en un array), puede estar en un fichero distinto con todos los textos a localizar o a modificar de fácil acceso. También puede estar en una base de datos o en un fichero de texto que pueda editar otra persona. Además nos permitiría dar formato a los números o a las cadenas.<br /><br />Por otra parte perdemos la posibilidad de cambiar de orden los elementos. El printf requiere que los elementos estén en orden.<br /><br />Con <span style="font-weight: bold;">strtr</span> o con <span style="font-weight: bold;">str_replace</span> o <span style="font-weight: bold;">str_ireplace</span> podemos conseguir una "cadena de formato" que permita cambiar el orden de los elementos de una forma ligera y eficiente:<br /><span style="font-family:monospace;"><br /></span><div style="text-align: left;"><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" >define(</span><span style="color: rgb(221, 0, 0);font-size:100%;" >'TITLE_CATEGORY'</span><span style="color: rgb(0, 119, 0);font-size:100%;" >, </span><span style="color: rgb(221, 0, 0);font-size:100%;" >'Categoría: {categories} Subcategorías: {categories_count} Entradas: {entries_count}'</span><span style="color: rgb(0, 119, 0);font-size:100%;" >);</span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" >echo </span><span style="color: rgb(0, 0, 187);font-size:100%;" >htmlspecialchars</span><span style="color: rgb(0, 119, 0);font-size:100%;" >(</span><span style="color: rgb(0, 0, 187);font-size:100%;" >strtr</span><span style="color: rgb(0, 119, 0);font-size:100%;" >(</span><span style="color: rgb(0, 0, 187);font-size:100%;" >TITLE_CATEGORY</span><span style="color: rgb(0, 119, 0);font-size:100%;" >, array(</span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" > </span><span style="color: rgb(221, 0, 0);font-size:100%;" >'{categories}' </span><span style="color: rgb(0, 119, 0);font-size:100%;" >=> </span><span style="color: rgb(0, 0, 187);font-size:100%;" >implode</span><span style="color: rgb(0, 119, 0);font-size:100%;" >(</span><span style="color: rgb(221, 0, 0);font-size:100%;" >' > '</span><span style="color: rgb(0, 119, 0);font-size:100%;" >, </span><span style="color: rgb(0, 0, 187);font-size:100%;" >$path</span><span style="color: rgb(0, 119, 0);font-size:100%;" >),</span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" > </span><span style="color: rgb(221, 0, 0);font-size:100%;" >'{categories_rev}' </span><span style="color: rgb(0, 119, 0);font-size:100%;" >=> </span><span style="color: rgb(0, 0, 187);font-size:100%;" >implode</span><span style="color: rgb(0, 119, 0);font-size:100%;" >(</span><span style="color: rgb(221, 0, 0);font-size:100%;" >' < '</span><span style="color: rgb(0, 119, 0);font-size:100%;" >, </span><span style="color: rgb(0, 0, 187);font-size:100%;" >array_reverse</span><span style="color: rgb(0, 119, 0);font-size:100%;" >)(</span><span style="color: rgb(0, 0, 187);font-size:100%;" >$path</span><span style="color: rgb(0, 119, 0);font-size:100%;" >)),</span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" > </span><span style="color: rgb(221, 0, 0);font-size:100%;" >'{categories_count}' </span><span style="color: rgb(0, 119, 0);font-size:100%;" >=> (int)</span><span style="color: rgb(0, 0, 187);font-size:100%;" >$categories_count</span><span style="color: rgb(0, 119, 0);font-size:100%;" >,</span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:100%;" > </span><span style="color: rgb(221, 0, 0);font-size:100%;" >'{entries_count}' </span><span style="color: rgb(0, 119, 0);font-size:100%;" >=> (int)</span><span style="color: rgb(0, 0, 187);font-size:100%;" >$entries_count</span><span style="color: rgb(0, 119, 0);font-size:85%;" ><span style="font-size:100%;">)</span></span></span></span></code><br /><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:85%;" ><span style="font-size:100%;">)));</span></span></span></span></code><br /><code></code></div><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);"><span style="color: rgb(0, 119, 0);font-size:85%;" ><br /></span></span></span></code></div><span style="font-family:courier new;"></span><div style="text-align: justify;">Se puede ver que he añadido una opción <span style="font-weight: bold;">categories_rev</span>, por si la persona que se encarga de traducir o de retocar los textos de la página determina que sería interesante colocar las categorías mas internas antes que las mas generales (por ejemplo para optimización para motores de búsqueda). Con <span style="font-weight: bold;">prg_(i)replace</span>, podríamos conseguir el mismo efecto que con strtr, si en vez de usar un array asociativa, usamos dos arrays, uno con las claves y otro con los valores.<br /><br />Para finalizar decir que con <span style="font-weight: bold;">preg_replace</span> y <span style="font-weight: bold;">preg_replace_callback</span>, podemos conseguir un reemplazado mucho mas potente, aunque algo mas complejo y lento. Pondré un ejemplo en el que se nos permite aplicar una función a un parámetro y obtener los parámetros:<br /><div style="text-align: left;"><pre class="phpcode"><code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 119, 0);">function </span><span style="color: rgb(0, 0, 187);">my_function</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$v</span><span style="color: rgb(0, 119, 0);">) {<br />return </span><span style="color: rgb(0, 0, 187);">strtr</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$v</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'aeios'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'43105'</span><span style="color: rgb(0, 119, 0);">);<br />}<br /><br />function </span><span style="color: rgb(0, 0, 187);">my_replace_callback</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$k</span><span style="color: rgb(0, 119, 0);">) {<br /></span><span style="color: rgb(0, 0, 187);">$rl </span><span style="color: rgb(0, 119, 0);">= &</span><span style="color: rgb(0, 0, 187);">$GLOBALS</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">'my_replace_list'</span><span style="color: rgb(0, 119, 0);">];<br /></span><span style="color: rgb(0, 0, 187);">$funcs </span><span style="color: rgb(0, 119, 0);">= &</span><span style="color: rgb(0, 0, 187);">$GLOBALS</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">'my_replace_list_funcs'</span><span style="color: rgb(0, 119, 0);">];<br /><br /></span><span style="color: rgb(0, 0, 187);">$k </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">explode</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">':'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$k</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">]);<br /></span><span style="color: rgb(0, 0, 187);">$key </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">array_shift</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$k</span><span style="color: rgb(0, 119, 0);">);<br /></span><span style="color: rgb(0, 0, 187);">$r </span><span style="color: rgb(0, 119, 0);">= isset(</span><span style="color: rgb(0, 0, 187);">$rl</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">$key</span><span style="color: rgb(0, 119, 0);">]) ? </span><span style="color: rgb(0, 0, 187);">$rl</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(0, 0, 187);">$key</span><span style="color: rgb(0, 119, 0);">] : </span><span style="color: rgb(0, 0, 187);">$key</span><span style="color: rgb(0, 119, 0);">;<br /><br />while (</span><span style="color: rgb(0, 0, 187);">sizeof</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$k</span><span style="color: rgb(0, 119, 0);">)) {<br /> </span><span style="color: rgb(0, 0, 187);">$func </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">array_shift</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$k</span><span style="color: rgb(0, 119, 0);">);<br /> if (</span><span style="color: rgb(0, 0, 187);">in_array</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$func</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$funcs</span><span style="color: rgb(0, 119, 0);">)) </span><span style="color: rgb(0, 0, 187);">$r </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">$func</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$r</span><span style="color: rgb(0, 119, 0);">);<br />}<br /><br />return </span><span style="color: rgb(0, 0, 187);">$r</span><span style="color: rgb(0, 119, 0);">;<br />}<br /><br />function </span><span style="color: rgb(0, 0, 187);">my_replace</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$t</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$l</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$f</span><span style="color: rgb(0, 119, 0);">) {<br /></span><span style="color: rgb(0, 0, 187);">$GLOBALS</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">'my_replace_list'</span><span style="color: rgb(0, 119, 0);">] = </span><span style="color: rgb(0, 0, 187);">$l</span><span style="color: rgb(0, 119, 0);">;<br /></span><span style="color: rgb(0, 0, 187);">$GLOBALS</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">'my_replace_list_funcs'</span><span style="color: rgb(0, 119, 0);">] = </span><span style="color: rgb(0, 0, 187);">$f</span><span style="color: rgb(0, 119, 0);">;<br />return </span><span style="color: rgb(0, 0, 187);">preg_replace_callback</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">'/\\{([^\\}]+)\\}/'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'my_replace_callback'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$t</span><span style="color: rgb(0, 119, 0);">);<br />}<br /><br /></span><span style="color: rgb(0, 0, 187);">$path </span><span style="color: rgb(0, 119, 0);">= array(</span><span style="color: rgb(221, 0, 0);">'objetos'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'inanimados'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'escolar'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'escritura'</span><span style="color: rgb(0, 119, 0);">);<br /><br /></span><span style="color: rgb(0, 0, 187);">define</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">'TITLE_CATEGORY'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Categoría: {categories:my_function:strtoupper} Subcategorías: {categories_count} Entradas: {entries_count}'</span><span style="color: rgb(0, 119, 0);">);<br /><br />echo </span><span style="color: rgb(0, 0, 187);">htmlspecialchars</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">my_replace</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">TITLE_CATEGORY</span><span style="color: rgb(0, 119, 0);">, array(<br /></span><span style="color: rgb(221, 0, 0);">'categories' </span><span style="color: rgb(0, 119, 0);">=> </span><span style="color: rgb(0, 0, 187);">implode</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">' > '</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">$path</span><span style="color: rgb(0, 119, 0);">),<br /></span><span style="color: rgb(221, 0, 0);">'categories_rev' </span><span style="color: rgb(0, 119, 0);">=> </span><span style="color: rgb(0, 0, 187);">implode</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">' < '</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(0, 0, 187);">array_reverse</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$path</span><span style="color: rgb(0, 119, 0);">)),<br /></span><span style="color: rgb(221, 0, 0);">'categories_count' </span><span style="color: rgb(0, 119, 0);">=> </span><span style="color: rgb(0, 0, 187);">10</span><span style="color: rgb(0, 119, 0);">,<br /></span><span style="color: rgb(221, 0, 0);">'entries_count' </span><span style="color: rgb(0, 119, 0);">=> </span><span style="color: rgb(0, 0, 187);">100</span><span style="color: rgb(0, 119, 0);">,<br />), array(</span><span style="color: rgb(221, 0, 0);">'strtoupper'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'trim'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'my_function'</span><span style="color: rgb(0, 119, 0);">)));</span></span></code></pre></div></div><span style="font-weight: bold;font-size:130%;" >Conclusión:</span><br /><ul><li><span style="font-weight: bold;">echo </span>es práctico y rápido para cosas sencillas que no requieran formato y que no se tengan que modificar o traducir.</li><li><span style="font-weight: bold;">printf </span>es práctico para cadenas que requieran formato y una localización sencilla.</li><li><span style="font-weight: bold;">echo+strtr </span>nos permite dar un formato ligero pero más potente que las otras dos opciones.</li><li><span style="font-weight: bold;">echo+preg_replace_callback</span> nos permite dar un formato mas pesado, pero tremendamente flexible, útil incluso para templates.</li></ul>Generalmente <span style="font-weight: bold;">echo+strtr</span> suele dar muy buenos resultados para localización de texto, y ofrece un código compacto de bastante rendimiento y sin ninguna dependencia adicional.soywiznoreply@blogger.comtag:blogger.com,1999:blog-1250738086120444710.post-47320800014993261952008-03-30T19:15:00.002+02:002008-03-31T02:39:15.489+02:00IntroducciónNuevo blog de programación en PHP.<br /><blockquote>Tras largos años de experiencia con PHP he ido enfrentándome a numerosos problemas que he ido resolviendo cada vez mejor. He desarrollado técnicas para montar páginas en php ligeras, eficientes y robustas.<br /><br />Internet está repleta de información sobre la programación en PHP, pero hay poca información sobre buenos hábitos, y técnicas de programación avanzadas y la poca que hay está en inglés.</blockquote>Este blog tratará sobre programación avanzada en PHP y técnicas para hacer una programación sencilla y eficiente.<br /><br />Explicaré también algunas técnicas nuevas que he desarrollado para el relativamente reciente PHP5 y sus nuevas características. Aunque muchas de las técnicas serán compatibles tanto con PHP5 como con el antiguo PHP4. No trataré temas de PHP3 ni por supuesto PHP/FI.soywiznoreply@blogger.com