<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alessio Mavica</title>
	<atom:link href="http://www.alessiomavica.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alessiomavica.com</link>
	<description>PHP &#38; MySQL Developer, Project Leader &#38; Scrum Master</description>
	<lastBuildDate>Tue, 14 Feb 2012 22:37:53 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>E_STRICT &#8211; 5 errores comunes</title>
		<link>http://www.alessiomavica.com/es/2012/02/14/e_strict-common-errors/</link>
		<comments>http://www.alessiomavica.com/es/2012/02/14/e_strict-common-errors/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 22:37:15 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[e_strict]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=207</guid>
		<description><![CDATA[Cuando vamos a desarrollar una aplicación en PHP es muy importante configurar de manera correcta el error_reporting para analizar los errores mensajes de nuestra aplicación. Desde la versión 5 se incluyó un nuevo nivel denominado E_STRICT. Según la definición de php.net: En PHP 5 está disponible el nuevo nivel de error E_STRICT [...] Habilitar E_STRICT [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando vamos a desarrollar una aplicación en PHP es muy importante configurar de manera correcta el error_reporting para analizar los <del datetime="2012-02-14T21:03:27+00:00">errores</del> mensajes de nuestra aplicación.<br />
Desde la versión 5 se incluyó un nuevo nivel denominado E_STRICT. Según la definición de <a href="http://www.php.net/manual/es/errorfunc.configuration.php#ini.error-reporting" title="php.net" target="_blank">php.net</a>:</p>
<blockquote><p>En PHP 5 está disponible el nuevo nivel de error E_STRICT [...] Habilitar E_STRICT durante el desarrollo tiene algunos beneficios. Los mensajes STRICT le ayudarán a usar el último y más sugerente método de codificación, por ejemplo le advertirá del uso de funciones obsoletas. </p></blockquote>
<p>Con la inclusión de E_STRICT en el E_ALL en PHP 5.4 no tendremos escusas para no mirar estos mensajes.<br />
<span id="more-207"></span></p>
<p><em><strong>¿POR QUÉ UTILIZAR E_STRICT?</strong></em></p>
<p>E_STRICT nos permite desarrollar código más limpio y asegura la mejor interoperabilidad y compatibilidad con versiones posteriores de PHP.</p>
<p><em><strong>LOS 5 ERRORES MÁS COMUNES UTILIZANDO E_STRICT</strong></em></p>
<p>Recientemente activé el E_STRICT en una web para actualizar su código y estos son los 5 errores más frecuentes con los que me he enfrentado:</p>
<p><u>1. Funciones obsoletas</u></p>
<p>PHP nos indica si una función es deprecada. Aquí la lista de las obsoletas para la versión 5.3: http://php.net/manual/en/migration53.deprecated.php</p>
<p>Error:</p>
<blockquote><p>PHP Deprecated:  Function xxx() is deprecated</p></blockquote>
<p><u>2. Static</u></p>
<p>Muchas veces olvidamos de poner la keyword "static" en la definición de una función que luego utilizaremos con clase::método</p>
<p>Error: </p>
<blockquote><p>Non-static method XXX should not be called statically, assuming $this from incompatible context</p></blockquote>
<p><u>3. Overloading</u></p>
<p>En PHP no existe el overloading, lo podemos sólo "simular" con __call pero como todos los métodos mágicos es bastante costoso. Es decir no podemos declarar dos funciones con el mismo nombre que se diferencien sólo por la firma (parámetros). Entonces en el caso de overriding (sobrescritura de un método de la clase padre que hemos heredado) tenemos que utilizar los mismo parámetros o al máximo añadir otros.</p>
<p>Error:  </p>
<blockquote><p>Declaration of XXX should be compatible with that of YYY</p></blockquote>
<p><u>4. Pasar una variable a una función que acepta un parámetro por referencia</u></p>
<p>No es posible pasar una variable a una función que acepta un parámetro por referencia. En concreto no podemos hacer algo así:</p>
<p><code>array_pop(explode('-', 'hola-mundo'));</code></p>
<p>Tenemos que guardar el resultado del explode en una variable y luego pasarla a array_pop:</p>
<p><code>$hola = explode('-', 'hola-mundo');<br />
array_pop($var);</code></p>
<p>Algunas funciones que cogen parámetros por referencia: array_shift, array_unshift, array_pop, array_push, current, end...</p>
<p>Error: </p>
<blockquote><p>Only variables should be passed by reference</p></blockquote>
<p><u>5. Crear un objeto genérico</u></p>
<p>A veces para pasar algo por json o por comodidad creamos un objeto genérico sin inicializarlo. Por ejemplo:</p>
<p><code>$obj->propriedad = true;</code></p>
<p>En este caso tenemos que inicializar el objeto de esta manera:</p>
<p><code>$obj = new stdClass();<br />
$obj->propriedad = true;</code></p>
<p>Error: </p>
<blockquote><p>Creating default object from empty value</p></blockquote>
<p><em><strong>CONCLUSIONES</strong></em></p>
<p>El utilizo de E_STRICT nos permitirá desarrollar aplicaciones compatibles con el futuro y nos ayuda a aprender detalles del PHP que desconocíamos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2012/02/14/e_strict-common-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño &#8211; Lista de los más usados y cuándo utilizarlos</title>
		<link>http://www.alessiomavica.com/es/2011/10/26/design-pattern/</link>
		<comments>http://www.alessiomavica.com/es/2011/10/26/design-pattern/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 14:48:35 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=192</guid>
		<description><![CDATA[Se pueden definir los patrones de diseño como soluciones técnicas probadas a problemas recurrentes de la programación. ¿Cuáles son los más famosos y cuáles son estos problemas recurrentes? En este articulo propongo una lista de los patrones de diseño más famosos asociados con el problema que solucionan para poderlos encontrarlos de manera rápida. PROS Y [...]]]></description>
			<content:encoded><![CDATA[<p>Se pueden definir los <strong>patrones de diseño</strong> como soluciones técnicas probadas a problemas recurrentes de la programación.</p>
<p>¿Cuáles son los más famosos y cuáles son estos problemas recurrentes? En este articulo propongo una lista de los patrones de diseño más famosos asociados con el problema que solucionan para poderlos encontrarlos de manera rápida.<br />
<span id="more-192"></span><br />
<em><strong>PROS Y CONTRAS DEL UTILIZO DE PATRONES DE DISEÑO</strong></em></p>
<p>Antes de todo se tiene que evidenciar que utilizar patrones de diseño tiene lados positivos y negativos.<br />
Aquí un resumen:</p>
<p><em>PROS:</em></p>
<ul>
<li>soluciones probadas </li>
<li>arquitectura más sencilla de decodificar (ingeniería inversa)</li>
</ul>
<p><em>CONTRAS:</em></p>
<ul>
<li>no siempre representan la solución más optimizada</li>
<li>entender cuándo es posible utilizarlos necesita gente con un mínimo de experiencia</li>
</ul>
<p><em><strong>LOS PATRONES DE DISEÑO MÁS CONOCIDOS Y QUÉ PROBLEMA SOLUCIONAN</strong></em></p>
<p><u>Adapter</u></p>
<p>Adaptar un nuevo objeto a un sistema de clases que ya existen.</p>
<p><u>Builder</u></p>
<p>Delegar la construcción de un objecto a otra clase. Se utiliza sobretodo para objecto complejos la cuya construcción depende de diferentes factores.</p>
<p><u>Decorator</u></p>
<p>Añadir o modificar funcionalidades de un objecto sin modificar su estructura interna.</p>
<p><u>Delegate</u></p>
<p>Modificar un objecto extrayendo una parte de código complejo pero independiente para crear una nueva clase. Se aconseja utilizarlo en caso de if o swtich complejos.</p>
<p><u>Façade</u></p>
<p>Se utiliza para crear una nueva tapa (clase) para ocultar la complejidad de un objecto.</p>
<p><u>Factory</u></p>
<p>Crear una "interfaz" que cree una instancia de un objecto sin especificar <em>a priori </em>la clase.</p>
<p><u>Interpreter</u></p>
<p>Analiza los elementos claves de una entidad y devuelve una interpretación (por ejemplo para crear un sistema de plantillas)..</p>
<p><u>Iterator</u></p>
<p>Ayuda a construir objectos cuyos elementos se puedas manipular de manera similar a un array.</p>
<p><u>Mediator</u></p>
<p>Se utiliza cuando tenemos que modificar muchos objectos similares. La clase mediator se ocupa de modificarlas todas de una vez.</p>
<p><u>Observer</u></p>
<p>Se utiliza para crear objectos que observan otros para proporcionar noticias sobre el estado de éstos.</p>
<p><u>Prototype</u></p>
<p>Crea un objecto que clona otro para ahorrar recursos (por ejemplo para objectos con constructores muy pesado y en parte inútil).</p>
<p><u>Proxy</u></p>
<p>Crea un objecto que se interpone de manera transparente entre otros dos para controlar el acceso o sobrescribir funcionalidades.</p>
<p><u>Singleton</u></p>
<p>Se utiliza para crear una única instancia de un objecto (por ejemplo el acceso a una BBDD).</p>
<p><u>Strategy</u></p>
<p>Aísla un algoritmo de un objecto que sepamos pueda variar de manera dinámica y creamos diferentes clases.</p>
<p><u>Template</u></p>
<p>Simplemente para crear una clase abstracta que proporciona métodos que utilizaremos en las clases que la heredan.</p>
<p><u>Visitor</u></p>
<p>Para minimizar las modificaciones de una clase (<a href="http://en.wikipedia.org/wiki/Open/closed_principle" title="Open-closed principle" target="_blank">principio open/close</a>) se crea otra que se tiene que llamar cada vez que se instancia la primera. Es como si "extendíamos" la clase virtualmente.</p>
<p><em><strong>CONCLUSIONES</strong></em></p>
<p>Los patrones de diseño son muy potentes y útiles. Cada buen programador tendría que conocerlos y utilizarlos. Espero que esta mini-guía os ayude a a reconocer cuando es posible utilizarlos para cumplir el principio del "no reinventes la rueda".</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2011/10/26/design-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP refactoring</title>
		<link>http://www.alessiomavica.com/es/2011/09/17/php-refactoring/</link>
		<comments>http://www.alessiomavica.com/es/2011/09/17/php-refactoring/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 18:22:43 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=169</guid>
		<description><![CDATA[Cada aplicación en continuo crecimiento necesita modificaciones para que sea más rápida, para reorganizarla o para prepararnos a nuevos desarrollos a medio o largo plazo. Este proceso se llama Refactoring, palabra que mucha gente odia porque necesita recursos para algo que no es ni un producto completo ni una release. Entonces es natural que vuestro [...]]]></description>
			<content:encoded><![CDATA[<p>Cada aplicación en continuo crecimiento necesita modificaciones para que sea más rápida, para reorganizarla o para prepararnos a nuevos desarrollos a medio o largo plazo.</p>
<p>Este proceso se llama <strong>Refactoring</strong>, palabra que mucha gente odia porque necesita recursos para algo que no es ni un producto completo ni una <em>release</em>. Entonces es natural que vuestro <em>Product Owner</em> no lo vea favorablemente. Aunque en continua lucha para el  <a href="http://en.wikipedia.org/wiki/Time_to_market" title="Alessio Mavica - Time To Market" target="_blank">Time To Market</a> los desarrolladores deberían prestar la debida atención a esta fase ya que se podría llegar a la clásica situación de entrada en pérdida en la que para modificar el <a href="http://en.wikipedia.org/wiki/Spaghetti_code" title="Alessio Mavica - Spaghetti code" target="_blank">código spaghetti</a> que hemos generado tiene un coste mayor que refactorizarlo.</p>
<p>Entonces cuáles son las lineas guías para un buen Refactogin? Buscamosles juntos...</p>
<p><span id="more-169"></span><br />
<em><strong>CUÁL ES LA DEFINICIÓN DE REFACTORING</strong></em></p>
<p>Oficialmente podemos definir el refactoring como el proceso para alterar el funcionamiento interno de una aplicación sin modificar su comportamiento externo.</p>
<p><em><strong>LOS OBJETIVOS</strong></em></p>
<ul>
<li>Menor complejidad</li>
<li>Mayor legibilidad</li>
<li>Mejorar la fase de mantenimiento</li>
<li>Mejorar la escalabilidad</li>
</ul>
<p>Entonce aquí un decálogo para acabar de manera satisfactoria un refactoring:</p>
<ol>
<li><a href="#new_methods">CREAR NUEVOS MÉTODOS</a></li>
<li><a href="#new_variables">INTRODUCCIÓN DE NUEVAS VARIABLES EXPLICATIVAS</a></li>
<li><a href="#rename_methods">RENOMBRAR MÉTODOS</a></li>
<li><a href="#move_items">MOVER ELEMENTOS</a></li>
<li><a href="#new_classes">CREAR NUEVAS CLASES</a></li>
<li><a href="#hide_delegates">OCULTAR DELEGADOS</a></li>
<li><a href="#array_to_object">TRANSFORMAR ARRAY EN OBJECTOS</a></li>
<li><a href="#inheritance_to_delegate">CAMBIAR LAS HERENCIAS POR DELEGADOS</a></li>
<li><a href="#last_three_rules">LAS ÚLTIMAS TRES REGLAS</a></li>
</ol>
<p><em><strong><a name="new_methods" style="color: black;">1. CREAR NUEVOS MÉTODOS</a></strong></em></p>
<p>Asumimos de tener esta función que calcula el precio total de un articulo con impuestos y gastos de envío:</p>
<pre class="brush: php">
public function getTotalPrice($id_product)
{
	$product_price = $this-&gt;getProductPrice($id_product);
	$product_price_taxed = $this-&gt;tax * $product_price;
	$product_price_shipping = $this-&gt;getProductShipping($id_product);

	$product_price_total =
		$product_price_taxed + $product_price_shipping;

	return $product_price_total;
}
</pre>
<p>Podemos aislar la línea para calcular los impuestos en un nuevo método:</p>
<pre class="brush: php">
// line 4 modified
$product_price_taxed = $this-&gt;getPriceTaxed($product_price);
</pre>
<pre class="brush: php">
// new method
public function getPriceTaxed($product_price)
{
	return $this-&gt;tax * $product_price;
}
</pre>
<p><em><strong><a name="new_variables" style="color: black;">2. INTRODUCCIÓN DE NUEVAS VARIABLES EXPLICATIVAS</a></strong></em></p>
<p>Sobretodo en los casos de ciclos con condiciones muy complejas es aconsejable crear nuevas variables explicativas.</p>
<pre class="brush: php">
if (strpos($_SERVER[&#039;SERVER_NAME&#039;], &#039;local&#039;) === FALSE)
	// do something
</pre>
<p>Aquí la vesión con una nueva variable explicativa:</p>
<pre class="brush: php">
$is_local = strpos($_SERVER[&#039;SERVER_NAME&#039;], &#039;local&#039;);

if ($is_local === FALSE)
	// do something
</pre>
<p><em><strong><a name="rename_methods" style="color: black;">3. RENOMBRAR MÉTODOS</a></strong></em></p>
<p>Odio profundamente los desarrolladores que crean métodos con nombre inútiles porque genéricos:<em>get</em>, <em>set</em>, <em>getForm</em>, <em>setValue</em>...</p>
<p>Los nombres de los métodos son como los titulares de los periódicos: tienen que ser explicativos pero no demasiado largos.</p>
<p><em><strong><a name="move_items" style="color: black;">4. MOVER  ELEMENTOS</a></strong></em></p>
<p>Otro paso para un buen refactoring es encontrar la posición correcta para métodos y atributos. Asumimos de haber creado una clase <em>car</em> con la variable <em>piston</em> y que luego hayamos creado la clase <em>motor</em>. Es evidente que la variable <em>piston</em> es un atributo de la clase <em>motor</em> y no de la clase <em>car</em>. Entonces en la fase de refactoring tenemos que reorganizar las asociaciones correctas entre clases, métodos y atributos.</p>
<p><em><strong><a name="new_classes" style="color: black;">5. CREAR NUEVAS CLASES</a></strong></em></p>
<p>Si tenemos una sentencia <em>if</em> (o <em>switch</em>) de este tipo:</p>
<pre class="brush: php">
public class car
{
	private $motor;

	public function __constructor($motor)
	{
		$this-&gt;motor = $motor;
	}

	public function getMotor()
	{
		if($this-&gt;motor == &#039;DIESEL&#039;)
			return $this-&gt;getDieselPrice();
		elseif($this-&gt;motor == &#039;UNLEADED&#039;)
			return $this-&gt;getUnleadedPrice();
	}
}
</pre>
<p>Entonces es muy probable que tenemos que crear tres nuevas clases:</p>
<ul>
<li>una abstracta <em>motor</em></li>
<li>una dieselMotor que extende <em>motor</em></li>
<li>una unleadedMotor que extende <em>motor</em></li>
</ul>
<p><em><strong><a name="hide_delegates" style="color: black;">6. OCULTAR DELEGADOS</a></strong></em></p>
<p>Si tenemos una línea de código del tipo:</p>
<pre class="brush: php">
$fuelType = $car-&gt;getMotor()-&gt;getFuelType();
</pre>
<p>En que el método <em>getMotor</em> es:</p>
<pre class="brush: php">
public function getMotor()
{
	return $this-&gt;motor;
}
</pre>
<p>Tenemos que modificarlo para devolver directamente el atributo que necesitamos:</p>
<pre class="brush: php">
public function getMotor()
{
	return $this-&gt;motor-&gt;getFuelType();
}
</pre>
<p>Ésto para seguir la  <a href="http://en.wikipedia.org/wiki/Law_of_Demeter" title="Alessio Mavica - Law of Demeter" target="_blank">Ley de Demeter</a> que dice que no tenemos que confiar en la estructura interna de un objecto ya que si viene modificado tendremos que cambiar muchas partes del código.</p>
<p><em><strong><a name="array_to_object" style="color: black;">7. TRANSFORMAR ARRAY EN OBJECTOS</a></strong></em></p>
<p>Asumimos que tenemos una clase <em>car</em> así:</p>
<pre class="brush: php">
public class car
{
	private $details;

	public function __constructor($details)
	{
		$this-&gt;details = $details;
	}
}
</pre>
<p>Entonces para crear el objecto <em>car</em> tenemos que pasar como parámetro un <em>array</em> con las características del coche. Si queremos devolver un detalle del coche tendremos que leerlo del array <em>$details</em>.<br />
La manera más correcta para inicializar un objecto y almacenar sus atributos es crear una variable por cada característica.</p>
<pre class="brush: php">
public class car
{
	private $motor;
	private $brand;
	private $model;

	public function __constructor($motor, $brand, $model)
	{
		$this-&gt;motor = $motor;
		$this-&gt;brand = $brand;
		$this-&gt;model = $model;
	}
}
</pre>
<p><em><strong><a name="inheritance_to_delegate" style="color: black;">8. CAMBIAR LAS HERENCIAS POR DELEGADOS</a></strong></em></p>
<p>Asumimos de tener una clase que implementa una <em>interfaz</em> para efectuar el <em>log</em> de la aplicación:</p>
<pre class="brush: php">
public class car extends Logger
{
	public function run()
	{
		...
		$this-&gt;log(...);
	}
}
</pre>
<p>La manera más correcta para hacerlo es pasa el objecto <em>logger</em> como parámetro en el momento de crear el objecto <em>car</em> y acceder a la variable sin extender ninguna clase. También en este caso estamos siguiendo la Ley de Demeter.</p>
<pre class="brush: php">
public class car
{
	private $logger;

	public function __contruct($logger)
	{
		$this-&gt;logger = $logger;
	}
	public function run()
	{
		...
		$this-&gt;logger-&gt;log(...);
	}
}
</pre>
<p><em><strong><a name="last_three_rules" style="color: black;">9. LAS ÚLTIMAS TRES REGLAS</a></strong></em></p>
<p>Los últimos tres consejos para un buen refactoring son:</p>
<ol>
<li>eliminar código redundante</li>
<li>escribir bloques de código pequeños</li>
<li>separar conceptos diferentes</li>
</ol>
<p><strong><em>CONCLUSIONES</em></strong></p>
<p>La fase de refactoring tiene que ser incluida en un buen proyecto y es fundamental para que la aplicación se mantenga simple, rápida y fácil de mantener.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2011/09/17/php-refactoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface vs. Abstract class en PHP</title>
		<link>http://www.alessiomavica.com/es/2011/09/12/interface-abstract-class-php-castellano/</link>
		<comments>http://www.alessiomavica.com/es/2011/09/12/interface-abstract-class-php-castellano/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:51:15 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[abstract class]]></category>
		<category><![CDATA[interface]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=138</guid>
		<description><![CDATA[Interface y Abrastract class son conceptos de la OOP poco usados en PHP. Los motivos son principalmente dos: requisitos poco claros (o idas poco claras por parte del desarrollador) en la fase de diseño poco conocimiento de estos conceptos Entonces intentamos aclararlos. QUÈ ES UNA INTERFAZ La definición más clara es que una interfaz es [...]]]></description>
			<content:encoded><![CDATA[<p>Interface y Abrastract class son conceptos de la <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Alessio Mavica - Object oriented programming" target="_blank">OOP</a> poco usados en PHP. Los motivos son principalmente dos:</p>
<ul>
<li>requisitos poco claros (o idas poco claras por parte del desarrollador) en la fase de diseño</li>
<li>poco conocimiento de estos conceptos</li>
</ul>
<p>Entonces intentamos aclararlos.<br />
<span id="more-138"></span><br />
<em><strong>QUÈ ES UNA INTERFAZ</strong></em></p>
<p>La definición más clara es que una interfaz  es un <em>contrato</em>.</p>
<p>Características:</p>
<ul>
<li>todas las clases que <em>implementan</em> una interfaz tienen que desarrollar todos los métodos que han sido definidos</li>
<li>por cada método se define sólo la firma</li>
<li>los métodos pueden ser solo públicos</li>
<li>una clase puede implementar más de una interfaz</li>
<li>una interfaz puede ser utilizada por el <a href="http://php.net/manual/en/language.oop5.typehinting.php" title="Alessio Mavica - Type Hinting" target="_blank">Type Hinting</a></li>
</ul>
<pre class="brush: php">
interface logsInterface
{
  public function log($message, $priority = null);
}
</pre>
<p><em><strong>QUÉ ES UNA CLASE ABSTRACTA</strong></em></p>
<p>Es una clase "padre" que tiene que ser <em>heredada</em> para poder ser utilizada. Las clases que la heredan se diferencian entre ellas solo en los métodos abstractos y pueden acceder a los métodos de la clase padre utilizando la keyword <em>parent</em>.</p>
<p>Características:</p>
<ul>
<li>no se puede instanciar</li>
<li>los métodos pueden ser abstractos (no implementados)</li>
<li>los métodos pueden ser no abstractos (implementados)</li>
<li>un clase puede heredar de una sóla clase abstracta</li>
</ul>
<pre class="brush: php">
abstract class logsAbstract
{
    private $variable;
    abstract public function logMethod();

    public function getVariable()
    {
        return $this-&gt;variable;
    }
}
</pre>
<p><em><strong>RESUMEN DE INTERFACE VS ABSTRACT CLASS</strong></em></p>
<table>
<tr>
<td style="width:50%"><strong>Abstract Class</strong></td>
<td style="width:50%"><strong>Interface</strong></td>
</tr>
<tr>
<td>Un método que no viene implementado se tiene que definir <em>abstract</em></td>
<td>No es posible implementar métodos sino solo definir su firma</td>
</tr>
<tr>
<td>Un método abstract se puede definir <em>public</em>, <em>protected</em> o <em>private</em>. Las subclases que heredan de la clase padre tienen que implementar estos métodos con la misma visibilidad o menor</td>
<td>Todos los métodos son públicos</td>
</tr>
<tr>
<td>Puede contener variables y constantes</td>
<td>Puede contener solo constantes</td>
</tr>
<tr>
<td>Una clase puede heredar solo una clase padre</td>
<td>Una clase puede implementar más de una interfaz</td>
<tr>
<td>Una clase hija puede o no sobrescribir (override) un método definido en la clase padre</td>
<td>Una clase que implementa una interfaz tiene que sobrescribir todos los métodos de la interfaz</td>
</tr>
</table>
<p>En principio si una clase abstracta contiene sólo métodos abstractos la estamos utilizando como una interfaz.</p>
<p><em><strong>CONCLUSIONES</strong></em></p>
<p>Las clases abstractas se utilizan para compartir funciones.<br />
Las interfaces se utilizan para compartir como se tiene que hacer algo.</p>
<p><em><strong>LINKS</strong></em></p>
<ul>
<li><a href="http://test.ical.ly/2010/05/12/why-are-interfaces-widely-ignored-in-the-php-world-and-what-use-do-they-have-when-working-with-symfony/" title="Alessio Mavica - Interface in Symfony" target="_blank">Why are interfaces widely ignored in the PHP world and what use do they have when working with symfony?</a></li>
<li><a href="http://drenganathan.wordpress.com/2009/02/06/difference-between-abstract-class-and-interface-in-php/" title="Alessio Mavica - Difference between class and interface" target="_blank">Difference between abstract classes and interfaces</a></li>
<li><a href="http://www.developer.com/lang/php/article.php/10941_3604111_2/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm" title="Alessio Mavica - PHP 5 OOP: Interfaces Abstract Classes and the Adapter Pattern" target="_blank">Ejemplo de interface y abstract class</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2011/09/12/interface-abstract-class-php-castellano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namespaces en PHP 5.3</title>
		<link>http://www.alessiomavica.com/es/2011/09/09/namespaces-php-castellano/</link>
		<comments>http://www.alessiomavica.com/es/2011/09/09/namespaces-php-castellano/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 11:08:47 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=82</guid>
		<description><![CDATA[Hasta hace un par de semanas desconocía que fuera posible en PHP (>=5.3) hacer algo similar a lo que se hace en Java con los packages. El problema que se nos presenta es lo de las name collitions o sea de la confusión que se puede producir hablando de dos cosas distintas que tienen el [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta hace un par de semanas desconocía que fuera posible en PHP (>=5.3) hacer algo similar a lo que se hace en Java con los <em>packages</em>.</p>
<p>El problema que se nos presenta es lo de las <em>name collitions </em>o sea de la confusión que se puede producir hablando de dos cosas distintas que tienen el mismo nombre. En el caso de PHP se podría producir sobrescribiendo nombres de clases, funciones y constantes.</p>
<p>La solución en PHP es tan sencilla cuanto genial y se llama <strong><em>namespaces</em></strong>. Además si se utiliza en la nueva versión de Zend Framework (2.0) será algo bueno <img title="Lengua" src="http://www.alessiomavica.com/wp-content/uploads/2011/09/xP_emoticon.png" alt="" width="19" height="19" /><br />
<span id="more-82"></span><br />
Oficialmente los namespaces sirven para encapsular. Ésto significa que podemos crear paquetes de clases estando seguros que no vamos a producir name collitions. Un ejemplo vale más de mil palabras:</p>
<p><em><strong>EJEMPLO:</strong></em></p>
<pre class="brush: php">
/*FILE file1.php*/
namespace namespace1;
class testClass {
        function whoAmI (){
                return &#039;file1&#039; . PHP_EOL;
        }
}

/*FILE file2.php*/
namespace namespace2;
class testClass {
        function whoAmI() {
                return &#039;file2&#039; . PHP_EOL;
        }
}

/*FILE test.php*/
require_once(&#039;./file1.php&#039;);
require_once(&#039;./file2.php&#039;);

$class1 = new \namespace1\testClass();
echo $class1-&gt;whoAmI();

$class2 = new \namespace2\testClass();
echo $class2-&gt;whoAmI();

/*********
Output:
file1
file2
*********/
</pre>
<p>Como podemos ver hemos utilizado dos clases con el mismo nombre sin generar colisiones. Lo mismo vale utilizando constantes y funciones.</p>
<p><em><strong>VENTAJAS:</strong></em></p>
<p>Entonces ¿cuáles son las ventajas?</p>
<p>1. código más claro<br />
2. mejor organización si estamos desarrollando una aplicación muy grande<br />
3. empezar a utilizar un nuevo elemento que será nuestro pan diario en los próximo años</p>
<p><em><strong>SUB-NAMESPACES:</strong></em></p>
<p>A diferencia de los packages de Java en PHP podemos crear diferentes niveles de namespace para que nuestro código resulte más organizado.</p>
<pre class="brush: php">
\namespace1\subnamespace\subsubnamespace
</pre>
<p><em><strong>UTILIZAR UN NAMESPACE (use):</strong></em></p>
<p>En los ejemplos anteriores hemos utilizado una barra inversa al principio del namespace. Ésto significa que el namespace que vamos a utilizar es de tipo GLOBAL. En otras palabras las rutas que utilizaremos se refieren a la root de nuestro "árbol" de namespaces. Una manera más sencilla de utilizar nuestros namespaces es definir el "nivel" que vamos a utilizar a través de la palabra reservada <em>use</em>.</p>
<p>Asumimos que tenemos la clase <em>class1</em> en el siguiente namespace:</p>
<pre class="brush: php">
\namespace1\subnamespace\subsubnamespace
</pre>
<p>Para poder instanciarla tendríamos que utilizar este código:</p>
<pre class="brush: php">
$class = new \namespace1\subnamespace\subsubnamespace\class1();
</pre>
<p>Trabajando con el use podemos simplemente escribir:</p>
<pre class="brush: php">
use \namespace1\subnamespace\subsubnamespace;
$class = new subsubnamespace\class1();
</pre>
<p><em><strong>ALIAS:</strong></em></p>
<p>El alias es un constructo muy útil para render nuestro código más sencillo y fácil de mantener. Suponemos que en el ejemplo anterior el nombre del namespace <em>subsubnamespace</em> no nos guste o sea demasiado largo, podemos utilizar la siguiente sintaxis:</p>
<pre class="brush: php">
use \namespace1\subnamespace\subsubnamespace as newname;
$class = new newname\class1();
</pre>
<p><em><strong>VARIABLE __NAMESPACE__:</strong></em></p>
<p>Para saber en que namespace estamos actualmente podemos utilizar la variable __NAMESPACE__</p>
<p><em><strong>CONCLUSIONES:</strong></em></p>
<p>Este post no quiere ser una disertación completa sobre los namespaces sino mostrar una panorámica de sus capacidades.</p>
<p>Os dejo 3 links muy interesantes sobre este tema:</p>
<ul>
<li><a href="http://php.net/manual/en/language.namespaces.php" title="Alessio Mavica - Manual PHP namespaces" target="_blank">Manual PHP</a></li>
<li><a href="http://www.sitepoint.com/php-53-namespaces-basics/" title="Alessio Mavica - Sitepoint" target="_blank">Post de otro blog en ingés</a></li>
<li><a href="http://www.baluart.net/articulo/los-namespaces-de-php-53-una-buena-forma-de-tener-un-codigo-mas-limpio-y-organizado" title="Alessio Mavica - Baluart" target="_blank">Otro blog que trata el tema de manera muy exhaustiva (recomendado)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2011/09/09/namespaces-php-castellano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Output Buffering Control</title>
		<link>http://www.alessiomavica.com/es/2011/08/24/php-output-buffering-control/</link>
		<comments>http://www.alessiomavica.com/es/2011/08/24/php-output-buffering-control/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 14:00:35 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Optimization]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=11</guid>
		<description><![CDATA[Cuando después de una petición el servidor envía el html al cliente, éste no se devuelve de una única vez sino a trozos. ¿Podemos hacer algo para controlarlo? La respuesta está en el Output Buffering Control de PHP. La idea es muy sencilla: Guardar el output en una variable y devolverla de una única vez. [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando después de una petición el servidor envía el html al cliente, éste no se devuelve de una única vez sino a trozos.<br />
¿Podemos hacer algo para controlarlo? La respuesta está en el Output Buffering Control de <a href="http://php.net/manual/es/book.outcontrol.php" title="PHP Output Buffering Controller" target="_blank">PHP</a>.</p>
<p>La idea es muy sencilla:<br />
Guardar el output en una variable y devolverla de una única vez.<br />
<span id="more-11"></span><br />
<em><strong>VENTAJAS</strong></em>:</p>
<p>Las vantajas de utilizar el Output Buffering Control son múltiples:</p>
<ul>
<li>Mayor velocidad</li>
<li>Menor utilizo de banda</li>
<li>Mayor control</li>
<li>Posibilidad de redirigir el output a un fichero</li>
<li>Manipular el output</li>
<li>Configurar header y cookie en cualquier punto del código</li>
</ul>
<p><strong><em>FUNCIONES</em></strong>:</p>
<p>La función para empezar a utilizar un Output Buffering Control es ob_start. Podemos pasar un parametro para definir la función callback.<br />
La más utilizada es <a href="http://www.php.net/manual/es/function.ob-gzhandler.php" title="ob_gzhandler" target="_blank">ob_gzhandler</a> que permite comprimir nuestro output con el algoritmo gzip.</p>
<p>Podemos eliminar el output buffering con dos funciones:</p>
<ul>
<li>ob_end_clean: limpia el output buffering</li>
<li>ob_end_flush: envía el output buffering al cliente y termina</li>
</ul>
<p>Otras funciones útiles son:</p>
<ul>
<li>ob_clean: limpia el buffer de salida</li>
<li>ob_get_clean: devuelve el buffer para almacenarlo en una variable y lo limpia</li>
<li>ob_get_flush: devuelve el buffer al cliente y lo limpia</li>
<li>ob_get_length: devuelve la longitud actual del buffer</li>
<li>ob_get_level: devuelve el nivel de anidamiento del mecanismo de buffer (se pueden anidar más buffers)</li>
<li>ob_get_status: devuelve el estado del buffer actual (o de todos si pasamos el parámetro TRUE)</li>
<li>ob_implicit_flush: por defecto si no llamamos la función ob_end_flush se ejecuta automáticamente al final del script</li>
<li>output_add_rewrite_var: añade una variable (nombre=valor) en cada URL que no sea absoluta y un campo hidden en los formularios</li>
<li>output_reset_rewrite_vars: restablece los valores del mecanismo de re-escritura de URLs</li>
<p><em><strong>EJEMPLOS</strong></em>:</p>
<pre class="brush: php">
&lt;php
ob_start();
echo &quot;Hello World!&quot;;
ob_end_flush();
?&gt;
</pre>
<p>Para realizar la compresión del output tenemos que pasar el parámetro ob_gzhandler a la función ob_start:</p>
<pre class="brush: php">
&lt;?php
ob_start(&#039;ob_gzhandler&#039;);
echo &quot;Hello World!&quot;;
ob_end_flush();
?&gt;
</pre>
<p><em><strong>TIPS</strong></em>:<br />
Podemos llamar a una función callback que nos limpie todo el output antes de enviarlo al cliente.<br />
Aquí algunos usos frecuentes:<br />
- remover espacios blancos repetidos:</p>
<pre class="brush: php">trim(preg_replace(&#039;/\s+/&#039;, &#039; &#039;, $buffer));</pre>
<p>- codificar entidad HTML: por ejemplo</p>
<pre class="brush: php">$buffer = str_replace(&#039;&amp;&#039;, &#039; &amp;&#039;, $buffer);</pre>
<p>- redirigir el output a un fichero</p>
<p><em><strong>PERFORMANCE</strong></strong></em>:<br />
Utilizando este simple script he registrado una mejora del 10% en la velocidad y el tamaño de la página ha pasado de 244.2KB a 612B</p>
<pre class="brush: php">
&lt;?php
ob_start(&#039;ob_gzhandler&#039;);
for ($j=1; $j &lt;= 5; $j++)
{
list($usec, $sec) = explode(&quot; &quot;,microtime());
$debut[$j] = ((float)$usec + (float)$sec);

echo str_repeat(&quot;0123456789&quot;,5000) . &#039;&lt;br&gt;&#039; ;

list($usec, $sec) = explode(&quot; &quot;,microtime());
$fin[$j] = ((float)$usec + (float)$sec);
}
echo &#039;&lt;br&gt;&lt;br&gt;TEST PERFORMANCE&lt;/br&gt;&lt;br&gt;&#039;;

$total = 0;
for ($j=1; $j &lt;= 5; $j++)
$total += round($fin[$j]-$debut[$j], 5) . &#039;&lt;br&gt;&#039;;

echo &#039;TOTAL: &#039;. $total;

ob_end_flush();
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/es/2011/08/24/php-output-buffering-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

