jueves, 28 de noviembre de 2013

Buenas tardes, el otro día andaba en el colectivo y me surgió una idea de como crear tipos en php y realmente por qué hacerlo?

Antes que nada, voy a aclarar que esto es una idea tipo "pasatiempo" realmente no me puse seriamente a planificar la idea, aunque no me parece mala, pero tampoco me parece una muy buena idea.

En php los tipos son manejados por el intérprete automáticamente, y se puede evaluar el tipo de dato usando un Triple Igual (===).
No obstante la falta de especificación de dichos tipos, a diferencia de otros lenguajes, en un aspecto puede llegar a ser interesante, pero en otro genera un problema que nunca antes se había dado, principalmente porque disminuye la seguridad en un lenguaje tan flexible.

La ausencia de control de tipos, dió lugar a las inyecciones sql, de manera MUY sencilla, y dió lugar a muchos otros inconvenientes, hasta falsificación de identidad en páginas simulando ser otra persona porque se meten caracteres especiales que quizá con un tipo estricto se podría evitar.

Pero en realidad esas son cosas muy sencillas, el problema está a la hora de desarrollar algún tipo de clase o componente o código que quieran utilizar o publicar para que otros utilizen, para garantizar la robustez deberíamos especificar por ejemplo que es lo que exigimos que se envíe como parametro, y no es posible especificar el tipo de dato que queremos recivir en una función por ejemplo, lo cual ya nos obliga a meter if, y cosas raras, o innecesarias mejor dicho.

Mi idea era crear una clase Type, y que sea heredada por clases menores que especifiquen los tipos, y usando TypeHinting de php, controlar los tipos y de paso darle seguridad, como verán ya tiene varias cosas positivas.

pueden ver la dependencia property aquí

abstract class Type
{
    use Property;
    protected $value;
    protected $original;

    public function __construct($value)
    {
        $this-->original = $value;
    }

    public function __ToString()
    {
        return $this->value;
    }

    public function trueval()
    {
         return $this->original;
    }
}

esto es un simple ejemplo de la clase marco de los tipos

y por ejemplo para un tipo int podríamos hacer esto:

class TypeInt extends Type
{
     public function __construct($value)
     {
         parent::__construct($value);
         $this->value = (int)$value;
     }
}

Como verán a partir de ahora lo que utilizaremos a la hora de trabajar con variables numéricas es crear una instancia de esta forma:

$id = new TypeInt($_GET['id']);
echo $id;
echo $id->original(); // sin castear a int

además en otras clases podemos obligar a que las funciones requieran una variable de tipo int

class example
{
      public function __construct(TypeInt $id)
      {
        // aquí el código
       }
}

si ustedes instancian la clase example y no le pasan una variable creada en base a typeint el interprete dará un FATAL.

pueden crear tipos tales como STRING parseando muchas cosas a la vez

class TypeStr extends Type
{
     public function __construct($value)
     {
         parent::__construct($value);
         $this->value = htmlentities(trim($value));
     }
}

y si tienen un parseador de bbc lo que pueden hacer es crear un TypeBBC,

No obstante, esto tiene una desventaja, en cada variable que usen tendrán una instancia de un objeto, lo cual consumirá un poco más de memoria que de la otra forma, asique tenganlo en cuenta, y esta es la razón por la que yo no implementé esto, porque aún no probé a ver si es muy exagerado el cambio de consumo.

saludos!
Categories: , ,

0 comentarios:

Publicar un comentario

Subscribete al RSS Follow me on Twitter!