Programacion PHP - Siu-Toba - V2.1
Programacion PHP - Siu-Toba - V2.1
CPC
Estándar de
Programación de PHP y
SIU - Toba
Acceso Norte Ruta Nacional Nº3 Caleta Olivia (9011) Santa Cruz TEL. +54 297 4854888 Int 114
e-mail: [email protected]
P A S
P l a n d e A c c i ó n
d e S i s t e m a s
Este documento cumple con las pautas establecidas por el Plan de Acción de Sistemas para la
generación de documentación.
Autores
Diaz, Miriam Rosana
Farias, Roberto Adrián
Miranda, María Gabriela
Molina, Sonia Elizabeth
® Impreso en el PAS
Contenido
1. INTRODUCCIÓN..........................................................................................................................................4
1.1. Alcance del documento............................................................................................................................4
1.2 Referencias...............................................................................................................................................4
1.3 Definiciones..............................................................................................................................................4
2. LINEAMIENTOS PARA LA CODIFICACIÓN EN EL FRAMEWORK SIU - TOBA.............................5
2.1 Formato del Archivo.................................................................................................................................5
2.2 Organización del Proyecto.......................................................................................................................5
2.3 Convención de Nombres...........................................................................................................................6
2.4 Estilos de Codificación.............................................................................................................................7
3.LINEAMIENTOS PARA LA CODIFICACIÓN EN PHP..........................................................................13
3.1 Formato del Archivo ..............................................................................................................................13
3.2 Organización del Proyecto.....................................................................................................................13
3.3 Convención de Nombres ........................................................................................................................14
3.4 Estilos de Codificación...........................................................................................................................15
4. RECOMENDACIONES PARA EL PROGRAMADOR.............................................................................19
4.1 Manejo de Excepciones..........................................................................................................................19
4.2 Seguridad en el Código..........................................................................................................................20
4.3 Depuración del Código Fuente..............................................................................................................22
4.4 Formularios y Validaciones...................................................................................................................22
4.5 Documentación Automática del Código.................................................................................................23
4.6 En cuanto a la organización de archivos .............................................................................................23
1. Introducción
En el presente documento se describe el estándar definido desde el PAS a utilizar en el
desarrollo de cualquier aplicación, blog, sistema y/o sitio de la UNPA que se implemente bajo el
lenguaje de script PHP y/o el framework SIU - toba.
1.2 Referencias
EST_DESARROLLO DE SITIOS Y APLICACIONES WEB_UNPA_V1.0.
pear.php.net/manual/en/standards.php
toba.siu.edu.ar/trac/toba/wiki/Convenciones/Codigo
www.w3.org/TR/WCAG20-TECHS/
1.3 Definiciones
Accesibilidad Web (Web Accessibility Initiative – WAI) 1: se refiere a la capacidad de acceso
a la Web y a sus contenidos por todas las personas independientemente de la discapacidad
(física, intelectual o técnica) que presenten o de las que se deriven del contexto de uso
(tecnológicas o ambientales). Esta cualidad está íntimamente relacionada con la usabilidad.
Aplicación web: las aplicaciones web pueden considerarse como un sitio web al que se accede
a través de un navegador, pero dotado de interactividad para la gestión, una base de datos,
comunicaciones encriptadas y contraseñas de acceso.
CSS (Cascading Style Sheets) 2: es un lenguaje para la definición de hojas de estilo que
describe la representación semántica (apariencia/ formato) de un documento escrito bajo algún
lenguaje de marcado. Su aplicación más común es páginas web desarrolladas bajo HTML y
XHTML, pero el lenguaje también se puede aplicar a cualquier tipo de documento XML, incluida
XML plano, SVG y XUL.
IDE (Integrated Development Environment): es una aplicación software que provee la
facilidades al programador para el desarrollo del software. El IDE generalmente se compone de:
Editor de código fuente, herramientas automáticas para la generación de código, y un depurador
de código.
HTML: siglas de HyperText Markup Language (Lenguaje de Marcado de Hipertexto), es el
lenguaje de marcado predominante para la elaboración de páginas web. Es usado para describir
la estructura y el contenido en forma de texto, así como para complementar el texto con objetos
tales como imágenes.
Sitio web: es una colección de páginas web relacionadas y comunes a un dominio web o sub-
dominio en la World Wide Web en Internet.
1
www.w3.org/WAI/
2
www.w3.org/Style/CSS/Overview.en.html
Legibilidad
Ancho de Línea
proyectos: Este directorio contiene los proyectos propios del ambiente y deberá alojar además
los nuevos proyectos creados por el programador. La organización interna mínima que se deberá
utilizar para cada proyecto es la siguiente:
• ...
• mi_proyecto :
✔ metadatos: Contiene la última exportación de metadatos del proyecto.
✔ php: Directorio que será parte del include_path de PHP, se asume que el proyecto
almacenará aquí sus extensiones y demás código.
login: En este directorio se alojarán los archivos php relacionados al login.
operaciones: Este directorio contendrá los Controladores de Interfaz (CI)
agrupados por menú a utilizar.
Modelo: en este directorio se ubicarán las clases del modelo de dominio.
✔ Sql: ubicar en este directorio las consultas sql utilizadas por el proyecto.
✔ temp: Directorio temporal no-navegable propio del proyecto
✔ www: Directorio navegable que contiene los puntos de acceso a la aplicación.
css: Plantillas de estilos CSS del proyecto.
img: Imágenes propias del proyecto.
temp: Directorio temporal navegable del proyecto.
• otro_proyecto:
• El nombre de la clase debe coincidir con el nombre del archivo (sin la extensión .php).
Constantes
• Las constantes deberán siempre definirse toda en mayúscula, con guión bajo si se
compone de más de una palabra para separarlas si fuese necesario. Ejemplos:
DB_DATASOURCENAME
Funciones
• Las funciones globales deberán definirse anteponiendo el nombre del paquete y/o sub-
paquete que lo contiene en mayúscula con el fin de evitar la colisión de nombres entre
paquetes. La inicial del nombre (después del prefijo) deberá definirse en minúscula y cada
letra que inicie una nueva palabra deberá escribirse en mayúscula . Ejemplo:
XML_RPC_serializeData()
Atributos y Métodos
• Los atributos se deberán definir en minúscula y en caso de componerse de más de una
palabra, a partir de la segunda palabra, la inicial de cada palabra deberá escribirse en
mayúscula. Ejemplo:
$colegioSecundario
• Los métodos son verbos o frases verbales. El nombre del método deberá escribirse en
minúscula. Si el nombre se compone de más de una palabra, la inicial de la palabras
consecutivas deberá indicarse en mayúscula. Ejemplo:
buscarPersona()
Variables globales
• Si dentro de un paquete se tienen que definir variables globales, sus nombres deben
comenzar con un solo guión bajo seguido del nombre del paquete y otro guión bajo. Por
ejemplo, para el paquete PEAR una variable global se podría definir como:
$_PEAR_destructor_object_list
• Clases
✔ Las clases deberán incluir un Bloque de Documentación en la parte superior con los
siguientes tags como mínimo:
//**
// * Descripción corta de la clase
// * copyright 2014 Plan de Acción de Sistemas
// * version Release: package_version
// * link http://framework.zend.com/package/PackageName
// * since Class available since Release 1.5.0
// * deprecated Class deprecated in Release 2.0.0
// **
• Funciones
✔ Todas las funciones y los métodos deberán tener un Bloque de Documentación conteniendo
como mínimo:
//*
//* Descripción de la función
//* Parámetros: Descripción de los parámetros que se le pasan y que
//devuelve. Si es relevante, también se indicará la siguiente
//información:
//Condiciones de entrada
//Condiciones de salida:
//Enumeración de otras funciones que utiliza
//Enumeración de las funciones que le utilizan
//* Modificaciones: Si es relevante, también se indicará una
//breve //historia de todas las modificaciones realizadas,
//indicando el //programador que las realizó y el motivo que las
//causó.
//*
Variables
• Para contadores usar nombre cortos y sin significado especial como:
$i, $j, $k
• En general evitar usar nombres como $temp o $parametro, al menos indicar el rol dentro de
este bloque de código, por ejemplo:
$nombre_temp
• Inicializar las variables al comienzo del método. Para las variables de clase es preferible darles
un valor por defecto en su definición en lugar de hacerlo en el constructor. Ejemplo:
<?php
class mi_clase
{
protected $es_inicial = false;
}
?>
✔ Usar type hinting para tipos de variable que son de una clase conocida, aunque a
veces quita flexibilidad y tiempo de ejecución, aumenta mucho la legibilidad y permite a los
editores de código hacer autocomplete. Ejemplo:
<?php
function conf__form(toba_ei_formulario $form)
{
}
?>
Clases
• Archivo
✔ Definir una única clase por archivo .
✔ El nombre de la clase debe coincidir con el nombre del archivo (sin la extensión .php) .
• Declaración
✔ Las llaves de inicio y fin deberán estar en una línea propia. Ejemplo:
<?php
class ci_navegacion
{
/* .. propiedades
métodos
*/
?>
• Tipos de Clases
✔ Representan una instancia particular (singleton): Tiene servicios para manipular a una sola
unidad se nombran en singular. Es la forma recomendada de POO (programación orientada
a objetos), aunque a veces puede ser ineficiente (requiere crear N objetos) .
$novedad = new novedad();
$novedad>set_fecha($fecha);
$novedad>eliminar();
✔ Representan el conjunto: Tiene servicios para manipular todas las unidades que
representan, se nombran en plural.
$novedades = new novedades();
$novedades>set_fecha($cod_novedad, $fecha)
$novedades>eliminar($cod_novedad);
Funciones Y Métodos
• Declaración
✔ Las llaves de inicio y fin de la función y/o método están en una línea propia
✔ Luego de cada coma que separa un parámetro, va un espacio de separación.
✔ Los parámetros que tienen valores por defecto van al final de la lista de parámetros.
✔ Si los argumentos dentro de una función exceden los 80 caracteres, los parámetros que se
ubiquen en la siguiente linea deberán indentarse con cuatro espacios simples. El paréntesis
de cierre y la llave de apertura deberán ubicarse en la siguiente linea.
Function someFunctionWithAVeryLongName($firstParameter =
'something', $secondParameter = 'other', $thirdParameter = 'etc'
){
}
✔ Los métodos de obtención y seteo de atributos se deberían denominar con el prefijo get y
set respectivamente. Lo que sigue al get o set va en singular o plural según el contenido sea
uno o un conjunto. Por ejemplo get_persona devuelve una persona y get_personas devuelve
un array de personas (cero o más). Ejemplo:
<?php
class nombre_clase
{
protected function set_nombre($param1, $param2=null)
{
}
function get_nombre()
{
}
}
?>
• Invocación
✔ La función debe ser invocada sin espacios entre el nombre de la misma, el paréntesis de
apertura y el primer parámetro.
✔ Luego de cada coma que separa un parámetro va un espacio. No deberá dejarse espacio
entre el último parámetros, el paréntesis de cierre y el punto y coma.
<?php
$var= foo($bar, $baz, $bat);
?>
• Alineación de asignaciones
✔ Para mejorar la legibilidad, si tengo más de una asignación en una misma porción de código,
se deberán alinear los signos igual (=) como se muestra a continuación:
<?php
$short = foo($bar);
$longer = foo($baz);
?>
Estructuras de Control
• Sintaxis
✔ Las estructuras if, for, foreach, while y do while deben tener un espacio entre la palabra
reservada y el paréntesis que abre, para poder distinguirlos de las llamadas a funciones:
<?php
if ((condicion1) || (condicion2)) {
accion1;
} elseif ((condicion3) && (condicion4)) {
accion2;
} else {
accionPorDefecto;
}
?>
✔ Siempre se usan llaves, incluso cuando son técnicamente opcionales (Ej. una única
sentencia dentro del if).
✔ Sentencias if con demasiadas condiciones. La primera condición alinea a las otras
condiciones.
<?php
if ( $condicion1
|| $condicion2
|| $condicion3
) {
//acá va el código
}
?>
<?php
switch (condicion) {
case 1:
accion1;
break;
case 2:
accion2;
break;
default:
accion_por_defecto;
break;
}
?>
• Complejidad Ciclomática
La cantidad de caminos independientes dentro de un fragmento de código se recomienda que
no supere una complejidad de 10. Si un método excede la complejidad de 20 el compilador
propio del framework lanzará un error.
Arreglos
• Acceso
✔ No usar espacios entre los corchetes. Ejemplo:
<?php
//Correcto
$valor = $arreglo[$indice];
//Incorrecto
$valor = $arreglo[ $indice ];
?>
La idea es que sea legible y fácil de mantener (nuevos campos, nuevos joins, etc.). Un
ejemplo:
<?php
$sql = "SELECT
t1.fecha_baja,
t1.campo as campo_1,
t2.campo_con_nombre_largo as campo_2,
t2.campo_sin_alias
FROM
tabla1 t1,
tabla2 t2
LEFT OUTER JOIN tabla3 t3 ON (t2.nombre =
t3.nombre)
LEFT OUTER JOIN tabla3 t4 ON (t2.nombre =
t4.nombre)
WHERE
t1.condicion = t2.condicion
AND t1.activo = 1
AND (t1.activo = 1 OR t1.activo IS NULL)
ORDER BY fecha_baja
";
$rs = toba::db()>consultar($sql);
?>
• Generales
✔ Se usan mayúsculas para las palabras reservadas y funciones SQL. El resto es todo
minúsculas.
✔ Siempre definir la consulta/comando en una variable propia, así es más fácil depurarla.
✔ Termina la cadena en una línea nueva, así es posible seguir agregando cosas fácilmente al
final.
✔ En caso de usarse alias para campos o tablas, alinearlos usando tabs.
• Campos en el SELECT
✔ Siempre explicitar el alias de la tabla usada, por ejemplo: t1.campo
✔ Preferir usar el nombre original del campo, sólo usar alias de campos para eliminar la
ambigüedad o aclarar situaciones. En caso de tener dos campos con igual nombre en el
select (por ejemplo llamados descripción) tanto el motor, pdo y toba no dan error. Lo que se
hace es reemplazar el valor en el arreglo asociativo, creando bugs difíciles de rastrear.
• Tablas FROM
✔ Siempre incluir un alias para la tabla, ser consistente con el alias usado para el resto de las
consultas.
✔ Para poder usar el esquema de perfiles de datos de toba, los inner joins se deben declarar
de la forma 'clásica' separando las tablas por coma, no reconoce las cláusulas 'INNER JOIN'
en el from.
• Condiciones WHERE
✔ Siempre usar quote para las partes dinámicas de la consulta.
Legibilidad
• El código deberá estar debidamente identado.
Ancho de linea
Array
• Para la definición del nombre de los Arrays se seguirá la convención de utilizar la abreviatura
(ver Tabla 2) seguido de un nombre representativo para el array, por ejemplo: arAlumnos
(representa un arreglo de datos para guardar información de los alumnos).
Clases
• Los nombres de las clases son sustantivos y se definirán en singular. La inicial del nombre
se escribirá en mayúscula. En caso de componerse de más de una palabra, la primera letra
de cada palabra se escribirá en mayúscula, ejemplo:
HistoriaClinica
Constantes
• Todas las letras utilizadas en un nombre de constante deben ser mayúsculas.
• Las palabras que forman el nombre de la constante deben estar separados por Underscore
(Guión bajo). Por ejemplo:
EMBED_SUPPRESS_EMBED_EXCEPTION
Funciones
• Las funciones propias son verbos o frases verbales, y se escribirán en minúscula, si el nombre
consiste en más de una palabra la primera letra de cada una de ella deberá ser mayúscula.
• Las funciones globales deberán definirse anteponiendo el nombre del paquete y/o sub-
paquete que lo contiene en mayúscula con el fin de evitar la colisión de nombres entre
paquetes. La inicial del nombre (después del prefijo) deberá definirse en minúscula y cada
letra que inicie una nueva palabra deberá escribirse en mayúscula . Ejemplo:
XML_RPC_serializeData()
Atributos y Métodos
• Definir el nombre del atributo en función del tipo de dato a almacenar. Dicho nombre
comenzará siempre con la primera letra minúscula correspondiente a su tipo de dato.
Ejemplo: iEdad
A continuación se detallan las abreviaturas a utilizar para cada tipo de dato:
• Los métodos son verbos o frases verbales, y se escribirán en minúscula, si el nombre consiste
en más de una palabra la primera letra de cada una de ella deberá ser mayúscula.
Variables
• El nombre de las variables o atributos debe estar compuesto de caracteres alfanuméricos, el
carácter guión bajo (_) no está permitido.
• Los nombres de variables siempre tiene que comenzar con letra minúscula, si el nombre
consiste en más de una palabra la primera letra de cada una de ella deberá ser mayúscula.
Por ejemplo: sNombreCompleto
• Las variables siempre debe ser lo más detallado posible al describir los datos que se tiene la
intención de almacenar en ellos.
• Definir el nombre la variable/ atributo en función del tipo de dato a almacenar. Dicho nombre
comenzará siempre con la primera letra minúscula correspondiente a su tipo de dato (ver
Tabla 2). Ejemplo: iDomicilio
• Clases
Las clases deberán incluir un Bloque de Documentación en la parte superior con los
✔
siguientes tags como mínimo:
//**
// * Descripción corta de la clase
// * copyright 2014 Plan de Acción de Sistemas
// * license http://www.unpa.edu.ar/pas/license
// * version Release: @package_version@
// * link http://framework.zend.com/package/PackageName
// * since Class available since Release 1.5.0
// * deprecated Class deprecated in Release 2.0.0
//**
• Funciones
✔ Todas las funciones y los métodos deberán tener un Bloque de Documentación conteniendo
como mínimo:
//**
//* Descripción de la función
//* Parámetros: Descripción de los parámetros que se le pasan y que
//devuelve. Si es relevante, también se indicará la siguiente
//información:
//Condiciones de entrada
//Condiciones de salida:
//Enumeración de otras funciones que utiliza
//Enumeración de las funciones que le utilizan
//* Modificaciones: Si es relevante, también se indicará una breve
historia de todas las modificaciones realizadas, indicando el
programador que las realizó y el motivo que las causó.
//**
Inclusión de archivos
String Literales
• Cuando se le asigna un texto literal (sin contenido de variables) se utilizarán comillas simples.
Por ejemplo:
$a = 'Texto de ejemplo';
• Cuando el texto literal contiene apostrofes, estará permitido la utilización de comillas dobles.
Esto es usado comúnmente en las sentencias SQL. Por ejemplo:
$sql = "SELECT id, name from people "
. "WHERE name='Fred' OR name='Susan'";
Concatenación
• Para concatenar Strings se utilizará el operador “.” (punto), con un espacio entre medio para
mejorar la lectura. Ejemplo:
$company = 'Zend' . ‘ ‘ . 'Technologies';
Arrays
• En aquellos arrays de índices numéricos estos deberán ser números positivos.
• En la declaración de los valores del array se dejará un espacio en blanco luego de la coma
para mejorar la lectura. Por ejemplo:
$arSampleArray = array(1, 2, 3, 'Zend', 'Studio');
• En caso que se necesiten varias líneas en la construcción del array, se indentará cada una
donde empezó la primera. En el caso de los arrays asociativos, se hace un quiebre de línea
por cada clave y valor.
<?php
$arSsampleArray = array(
'firstKey' => 'firstValue',
'secondKey' => 'secondValue'
);
?>
Clases
• Declaración de Clases.
✔ La llave debe estar siempre por escrito en la línea debajo del nombre de la clase.
✔ Cada clase debe tener un bloque de documentación inicial que indica la razón de ser de la
clase.
✔ Todo el código de una clase debe tener una sangría de cuatro espacios.
✔ Sólo se permite una clase en cada archivo PHP. Esto permitirá la búsqueda e identificación
de las clases.
✔ Colocar el código adicional en los archivos de clase se permite pero no se recomienda. En
este tipo de archivos, dos líneas en blanco debe separar la clase desde cualquier código
adicional de PHP en el archivo de clase. Ejemplo:
// Documentation Block Here
class SampleClass
{
// Todo el contenido de la clase aquí
// identada por cuatro espacios
}
✔ Las clases que se extienden a otras clases o implementan interfaces deben declarar sus
dependencias en la misma línea cuando sea posible. Ejemplo:
class SampleClass extends FooAbstract implements BarInterface
{
Métodos y Funciones
Ejemplo 2:
// Documentation Block Here
class Foo
{
// Documentation Block Here //
public function bar($arg1, $arg2, $arg3,
$arg4, $arg5, $arg6 )
{
// Todo el contenido de la función
// identado por cuatro espacios vacíos
}
}
Estructura de Control
• If/Else/Elseif
✔ En las declaraciones if/then/else se deberá tener un espacio antes y después del paréntesis
condicional, en la misma línea se abre llave y se cierra en una línea diferente, lo mismo se
aplica al elseif. Por ejemplo:
if ($a != 2) {
$a = 2;
} elseif ($a == 3) {
$a = 4;
} else {
$a = 7;
}
• Switch
✔ Las sentencias de control escritas con la declaración "switch" deben tener un espacio antes
del paréntesis de apertura de la sentencia condicional y después del paréntesis de cierre.
✔ Todo el contenido dentro de la declaración "switch" debe separarse usando cuatro espacios.
✔ El contenido dentro de cada "case" debe separarse con cuatro espacios de indentacion.
Ejemplo:
switch ($numPeople) {
case 1:
break;
case 2:
break;
default:
break;
}
• Inicializar siempre todas las variables. Las variables no inicializadas pueden causar que se
ejecuten secciones del código no esperadas.
<?php
if (correct_user($_POST['user'], $_POST['password']) {
$login = true;
if($login) {
forward_to_secure_environment();
?>
• Evitar utilizar variables para la incorporación de archivos y/o código. Facilitan la ejecución de
código externo malicioso. Para ello verificar en la configuración del php.ini el valor de la
variable allow_url_fopen, por defecto esta seteado en On, cambiar al valor Off.
• Si se utilizan variables para incorporar archivos, validar los mismos utilizando listas fijas
implementadas con arreglos o con swtichs, etc.
<?php
$valid_files = array(
'show' => 'show.php',
'list' => 'list.php'.
);
if (isset($valid_files[$_GET['action']] ) ) {
require_once $valid_files[$_GET['action']];
} else {
echo 'not a valid action. ';
}
?>
/*ejemplo 1 – funciones de escape */
<?php
$sql = 'SELECT password FROM user WHERE login = '.
mysql_real_escape_string( $_GET['login'] );
?>
/*ejemplo 2 – consultas preparadas*/
<?php
$db = new PDO( ... );
$stmt>execute( array($_GET['login'] ) );
?>
<?php
var_dump( ctype_alnum( 'una cadena') );
var_dump( ctype_alnum( 'caracteres inválidos $%&/ ') );
var_dump( filter_alnum( 'example.com',
FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED ) );
?>
boolean false
boolean false
boolean false
Configuración
Cookies y sesiones
• Las cookies son fáciles de modificar por el usuario. Para ello se recomienda utilizar sesiones
para almacenar datos importantes.
• Al usar md5() (o sha1(), etc.), no hacerlo directamente en la clave, pues pueden escribirse
programas que traten de adivinar esta información en forma forzada. Concatenar con otra
información (ej. Nombre del servidor, del usuario, etc.), antes de procesar.
Formulario de Logueo
3
Magic quotes es un procedimiento que automáticamente limpia los datos de entrada de un script PHP.
4
www.xdebug.org
5
www.dd.cron.ru
El formulario para el logueo de usuarios a sitio y/o aplicaciones web desarrollados desde el PAS,
deberá considerar los aspectos indicados en el procedimiento PRO_GESTION DE
USUARIOS_V1.0.
/php/operaciones/SIU-Mapuche/Generación_de_datos/sql/consultasGeneracionDeDatos.php
6
www.phpdoc.org