miércoles, 14 de junio de 2017

isset(), is_null() y empty(): Diferencias y ejemplos de uso


En PHP tenemos diferentes funciones para comprobar una variable independientemente del tipo de datos que almacene. Puede que las tres funciones más populares y frecuentemente utilizadas para este fin sean isset()is_null() y empty(). Las tres devuelve un valor lógico true/false y en muchos casos utilizar cualquiera de ellas puede ser indiferente, en otros podemos encontrarnos con situaciones inesperadas.
En general, se suele entender is_null() como opuesta a isset(), y esta como opuesta a empty(). En este tutorial veremos como esto no es del todo cierto e intentaré explicar las peculiaridades de cada una de estas funciones para poder utilizarlas de forma correcta.
1

is_null

Echemos mano al manual PHP para is_null(). Dice así:
is_null — Comprueba si una variable es NULL
Por tanto, esta función devolverá true cuándo la variable comprobada tenga un valor NULL(nulo). En PHP NULL se considera un valor especial que representa a una variable sin valor, lo que puede ocurrir cuándo la variable no haya sido definida, cuándo esté definida pero sin valor asignado, cuándo se le asigne el valor NULL o cuándo haya sido destruida con usent().
//La variable no está definida
// Devuelve true y lanza un aviso tipo Notice: undefined variable
var_dump( is_null($var) );

//Se asigna la constante NULL
$var = NULL;
var_dump( is_null($var) );

//Se declara la variable pero no se le asigna ningún valor
$var;
var_dump( is_null($var) );

//La variable es destruida con unset()
$var = "Hola";
unset($var);
var_dump( is_null($var) );
En los cuatro casos anteriores is_null($var) devuelve true. Además, en el primer caso cuándo $var no ha sido definida, y en el último caso cuándo $var ha sido destruida, se lanzará un error tipo Notice: Undefined variable. Por el contrario, si se utilizan variables no definidas con isset() y empty() no aparecerá ningún tipo de aviso.
2

isset()

La función isset(), según el manual PHP, determina si una variable ha sido declarada y su valor no es NULO. Es importante fijarse bien: si una variable tiene valor nulo, aunque haya sido declarada, isset() devolverá false. En todos los ejemplos anteriores para is_null()isset() devolvería false mientras que is_null() devolvió true, por eso se consideran funciones opuestas. También es importante fijarse que isset() devuelve true para variables con valores vacíos, por ejemplo, cadenas de texto vacías:
//isset() devuelve false por que $var no ha sido definida
var_dump( isset($var) );

//isset() devuelve false aunque la variable haya sido declarada pues su valor es NULL
$var;
var_dump( isset($var) );

//isset() devuelve true. El valor ya no es nulo aunque esté vacío
$var = "";
var_dump( isset($var) );
Referencia: manual isset().
3

empty()

Echemos mano de nuevo al manual a ver que dice de la función empty():
empty — Determina si una variable está vacía
La definición es muy sencilla pero abarca muchos posibles escenarios. Una variable se considera vacía si no existe (aquí coincide con isset() y con is_null()) o si su valor es false. El valor false para una variable puede ser un valor lógico false, una cadena vacía, el número 0 (cero), un array vacío, el valor NULL y, aquí la peculiaridad, el string "0" (no como valor numérico, sino como cadena de texto) también dará positivo en la función empty().
//La variable no está definida. empty() devuelve true
var_dump( empty($var) );

//empty() devuelve true. El valor de $var es nulo
$var;
var_dump( empty($var) );

//empty() devuelve true para un string vacío
$var = "";
var_dump( empty($var) );

//empty() devuelve true para un array vacío
$var = array();
var_dump( empty($var) );

//empty() devuelve true para el string "0"
$var = "0";
var_dump( empty($var) );

//empty() devuelve true para el número entero 0
$var = 0;
var_dump( empty($var) );

//empty() devuelve true para el valor lógico false
$var = false;
var_dump( empty($var) );

//empty() devuelve false para el valor lógico true
$var = true;
var_dump( empty($var) );
Referencia: manual empty().

¿Cuándo utilizar cada una?

Esta es una pregunta con muy difícil respuesta y depende de cada situación. Lo más que puedo hacer es decir lo que yo suelo hacer:
  • Utilizo empty() con mucha más frecuencia que las demás y lo hago si necesito comprobar que una variable no tiene un valor vacío pero no es estrictamente necesario comprobar que la variable haya sido declarada. Si la variable no existe empty() devuelve true pero no lanza error. Si la cadena de texto “0” es un valor válido y posible para la variable a comprobar no se debe utilizar empty() por considerar este valor como vacío.
  • Utilizo isset() sólo cuándo necesito comprobar que una variable existe y no es nula aunque tenga un valor vacío.
  • Dejo is_null() para pocos casos y son aquellos en los que es necesario comprobar específicamente que una variable sea nula o no exista.
  • Si necesito hacer una comparación estricta pero no se si la variable ha sido declarada, lo compruebo previamente con isset().

Tabla comparativa

Esta tabla ha sido tomada de aquí y ampliada para los posibles valores de $x de espacio y NULL byte ("\0"). Nota que if($x) cuándo $x no existe se interpreta como false pero lanzará un error tipo NOTICE.
Comprobación de una variable con diferentes funciones PHP
Expresióngettype()empty()is_null()isset()booleanif($x)
$x = “”;stringTRUEFALSETRUEFALSE
$x = ” “; (espacio)stringFALSEFALSETRUETRUE
$x = null;NULLTRUETRUEFALSEFALSE
$x = “\0”; (NULL byte)stringFALSEFALSETRUETRUE
var $x;NULLTRUETRUEFALSEFALSE
$x is indefinidaNULLTRUETRUEFALSEFALSE
$x = array(); (array vacío)arrayTRUEFALSETRUEFALSE
$x = false;booleanTRUEFALSETRUEFALSE
$x = true;booleanFALSEFALSETRUETRUE
$x = 1;integerFALSEFALSETRUETRUE
$x = 42;integerFALSEFALSETRUETRUE
$x = 0;integerTRUEFALSETRUEFALSE
$x = -1;integerFALSEFALSETRUETRUE
$x = “1”;stringFALSEFALSETRUETRUE
$x = “0”;stringTRUEFALSETRUEFALSE
$x = “-1”;stringFALSEFALSETRUETRUE
$x = “Hola!”;stringFALSEFALSETRUETRUE
$x = “true”;stringFALSEFALSETRUETRUE
$x = “false”;stringFALSEFALSETRUETRUE

Share:

martes, 18 de abril de 2017

Mi primera aplicación en Laravel con TDD

Desarrollo guiado por pruebas de software, o Test-driven development(TDD) es una práctica de ingeniería de software que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y Refactorización (Refactoring).


1. Crear una prueba tests/features (uma clase de prueba CreatePostsTest.php en camelcase)
   1.1. Crear la funcion public function test_a_user_create_a_post()
Fuente Styde; https://goo.gl/7axYrg

2. Ejecutar prueba  vendor\bin\phpunit --filter test_a_user_create_a_post
3. Crear la Ruta (routes) routes/web.php

// Posts
Route::get('posts/create', [
    'uses' => 'CreatePostController@create',
    'as' => 'posts.create',
])

Route::post('posts/create', [
    'uses' => 'CreatePostController@store',
    'as' => 'posts.store',
])

4. Crear el controlador (Mencionado en el punto 3)

Para esta lección hemos usado los métodos del componente de pruebas de Laravel:
  • actingAs para autenticar un usuario dado.
  • visit para visitar una ruta o URL dado.
  • type para escribir algún texto en un campo dado.
  • press para hacer clic en un botón con el nombre dado.
  • seeInDatabase para evaluar si el registro fue creado correctamente en la base de datos.
  • seeInElement para evaluar si un elemento HTML contiene la información especificada. 
Puedes conocer más de este método en la lección:
Métodos de pruebas within y seeInElement de InteractsWithPages en Laravel 5.2

Comandos usados para crear:
  • El controlador php artisan make:controller CreatePostsController
  • La migración php artisan migration create_posts_table --create=posts
  • El modelo php artisan make:model Post
Share:

jueves, 13 de abril de 2017

Codeship - Integración Continua 

Usualmente en un equipo de trabajo se desarrollan actualizaciones y avances del proyecto lo que a merita en algunos casos integrar ese código al proyecto varias veces al día.
Para estos casos se utiliza la practica de desarrollo de software [Continuous Integration - CI] Integración Continua, esta práctica permite a los miembros de un equipo integrar su trabajo frecuentemente, validando que antes de integrar su código al proyecto se evalué que no contenga errores lo que lleva a una reducción de conflictos y problemas de integración que ocurren cuando trabajamos en equipo, además también permite detectar errores de forma temprana y en resumen permite que los desarrolladores trabajen de forma más precisa y creen proyectos en menos tiempo.

Fuente Styde: https://goo.gl/7SxpcH

Accesos:

Codeship: https://app.codeship.com/projects
Bitbucket: https://bitbucket.org/


Share:

lunes, 20 de marzo de 2017

Repara USB de tamaño falso y colocar su tamaño real

[Link de descarga




Share:

miércoles, 15 de febrero de 2017

Instalación y configuración de un nuevo proyecto con Laravel 5.3

Instalación y configuración de un nuevo proyecto con Laravel 5.3

1.- Elaboracion de un entorno de desarrollo

Instalación y configuración del proyecto
1
composer create-project laravel/laravel foro "5.3.*"
En caso de estar instalando el proyecto a partir de la clonación o descarga desde Github debes crear manualmente el archivo .env haciendo una copia del archivo .env.example y luego generar una nueva API key con php artisan key:generate
Crear base de datos de proyecto:

->cd unconect [Ingresar al directorio del proyecto]
-> mysql -u root -p
-Enter password: [secret]

MariaDB> CREATE DATABASE [NomBD];

/*Crear un nuevo usuario y asigna ALL privilegios, y acceso desde phpMySQL en LOCALHOST*/
MariaDB> GRANT ALL ON [NomBD].* TO
              -> [NomUsrNew]@'localhost' IDENTIFIED BY '[password]';

/*OPCIONAL: Crear un nuevo usuario y asigna ALL privilegios, y acceso desde phpMySQL desde un IP especifico o rango de IPs*/
MariaDB> GRANT ALL ON [NomBD].* TO
              -> [NomUsrNew]@'192.168.11.%' IDENTIFIED BY '[password]';

MariaDB> exit


Instala el sistema de autenticación que viene por defecto en Laravel ejecutando:

1
php artisan make:auth

Modifica el archivo .env para configurar la variable de entorno para URL de la aplicación y las credenciales de la base de datos, es decir, edita las siguientes llaves:


1
2
3
4
5
APP_URL=http://foro.app
DB_HOST=localhost
DB_DATABASE=foro
DB_USERNAME=tu-username
DB_PASSWORD=tu-password

Cambia el nombre de la aplicación en el archivo config/app.php modificando la clave 'name' => 'Foro'


Descarga las traducciones a español desde el repositorio de GitHub https://github.com/caouecs/Laravel-lang y configura la clave locale en el archivo config/app.php


Instala dos paquetes de terceros que usaremos en la aplicación:

Paq1. styde/html


Laravel 5.3 users:
Install by running composer require "styde/html=~1.2"
  1. Next, add the new provider to the providers array in config/app.php
'providers' => [
    // ...
    Styde\Html\HtmlServiceProvider::class,
    // ...
],
'aliases' => [
    // ...
    'Access' => Styde\Html\Facades\Access::class,
    // ...
],


  1. Also, you need to register in the app/Http/Kernel.php
// For Laravel 5.3
protected $middlewareGroups = [
    \Styde\Html\Alert\Middleware::class,
    //...
];

Paq2. graham-campbell/markdown

To get the latest version of Laravel Markdown, simply require the project using Composer:
$ composer require graham-campbell/markdown
Once Laravel Markdown is installed, you need to register the service provider. Open up config/app.php and add the following to the providers key.
  • 'GrahamCampbell\Markdown\MarkdownServiceProvider'
  • GrahamCampbell\Markdown\MarkdownServiceProvider::class,
You can register the Markdown facade in the aliases key of your config/app.php file if you like.
  • 'Markdown' => 'GrahamCampbell\Markdown\Facades\Markdown'
  • 'Markdown' => GrahamCampbell\Markdown\Facades\Markdown::class,
Ejecutamos para terminar la configuración del paquete:
$ php artisan vendor:publish
Share:

BTemplates.com

Con la tecnología de Blogger.