Computers">
PHP Avanzado
PHP Avanzado
PHP Avanzado
2
TEMA
Programación con JavaScript
TEMA 2 – Esquema
Estructuras de control Manejo de arrays en PHP Orientación a objetos en PHP
2
foreach Herencia
Métodos y funciones para
manejo de arrays Sobrecarga de constructores y
Funciones en PHP destructores
Ideas clave
Para estudiar este tema lee las Ideas clave que encontrarás a continuación.
En este tema vamos a aprender las particularidades del lenguaje PHP relativos a la
programación básica, la sintaxis de PHP para establecer estructuras de control, que
serán los ya conocidos bloques condicionales y los bucles, aprendiendo a manejar las
distintas posibilidades que nos ofrecen.
También será de suma importancia, por el hecho de que PHP va a escribir información
en nuestra página web, el manejo de cadenas de caracteres. En este apartado, hemos
incluido distintas funciones que te serán de utilidad para manejar cadenas, que
facilitarán la inclusión y tratamiento de información desde tu código PHP.
También permite decidir entre dos grupos de sentencias, indicando qué grupo se ejecuta
cuando se cumple la condición (if) y cual se ejecuta cuando no se cumple (else). Y, por
último, también permite anidar y encadenar los if–else para establecer condiciones más
complejas. A continuación se presenta un ejemplo para mostrar su uso.
<?php
if ($i == 0) {
echo "i es igual a 0";
} elseif ($i == 1) {
echo " i es igual a 1";
} else {
echo "i igual a 2";
}
?>
<?php
switch ($i) {
case 0:
echo "i es igual a 0";
break;
case 1:
echo "i es igual a 1";
break;
default:
echo "i es igual a 2";
}
?>
» Después de las instrucciones incluidas para cada posible valor (para cada case), hay
que poner un break, para indicar que termina. Si no lo ponemos, aunque empiecen
las sentencias del siguiente case, se seguirán ejecutando. Este comportamiento es
muy útil en algunos casos y por tanto, tiene sentido. No olvides colocarlo siempre que
las instrucciones que incluyen para cada valor de los case sean excluyentes.
El otro grupo de estructuras de control son las iterativas, entre las que encontramos
las siguientes: while, do…while, for y foreach. Todas ellas tienen en común que
ejecutan el código contenido en la estructura un número determinado de veces, que
puede estar determinado por un contador o por algún otro tipo de condición.
Comenzaremos con el while que, en inglés, significa mientras. Por tanto, las sentencias
contenidas en esta estructura se ejecutarán mientras la condición indicada sea cierta.
Hay dos opciones para escribir la sentencia while en PHP. La primera es la que venimos
utilizando en las sentencias de selección, es decir, agrupando las sentencias entre llaves;
la otra, es incluyendo la palabra endwhile para indicar el final del grupo de sentencias
que se ejecutan como parte del while. A continuación, mostramos un ejemplo escrito de
las dos formas posibles, para señalar las diferencias.
<?php
$i = 1;
while ($i <= 10){
echo $i;
$i++;
}
$i = 1;
while ($i <= 10):
echo $i;
$i++;
endwhile;
?>
La sentencia do…while, aunque es muy similar a esta, tiene una diferencia significativa:
la condición de repetición del bucle se evalúa después de la primera iteración, por lo que
las instrucciones incluidas dentro de esta estructura de control se ejecutarán siempre, al
menos, una vez. Veámoslo con un ejemplo.
<?php
$i = 0;
do{
echo $i;
while ($i > 0); //Lo escribe una vez porque se comprueba después
}
?>
A continuación, comentaremos la sentencia for, que incluye una inicialización del valor
de la variable sobre la que se hará la comprobación, la comprobación de la condición
propiamente dicha y la actualización de la variable. El uso más habitual es que la
condición sea numérica, aunque podemos encontrar algún caso en que se use de otra
forma. Aquí incluimos el mismo ejemplo que realizamos con la estructura while, para
que compruebes las semejanzas y diferencias entre las distintas estructuras.
<?php
for ($i = 0; $i <= 10; $i ++)
echo $i;
?>
Una sentencia similar a esta, pero específicamente diseñada para los arrays, es la
sentencia foreach. Su principal particularidad es que nos permite acceder los elementos
de un array de forma sencilla ya que ofrece dos posibilidades: acceder a los elementos o
acceder a los elementos y los índices. Aunque todavía no hemos hablado de arrays,
presentaremos aquí su sintaxis general, que comprenderás mejor en el siguiente
apartado de este tema.
<?php
foreach (array as $valor){
grupo_sentencias;
}
Para finalizar este apartado, vamos a comentar las instrucciones break y continue. La
primera permite finalizar la ejecución de una estructura de control iterativa (y de switch)
antes de que se cumpla la condición que la controla. Puede recibir un argumento,
indicando cuántas estructuras de control anidadas debe finalizar. Veamos un ejemplo de
uso.
<?php
$i = 0;
$parar = true;
while ($i <= 10){
echo $i;
$i ++;
if ($parar == true)
break;
}
?>
Por su parte, la sentencia continue omite la ejecución de las sentencias del bucle que
haya por debajo e inicia la siguiente iteración, por ejemplo:
<?php
for ($i = 0; $i <= 10; $i++){
echo $i;
if ($i % 2 == 0)
continue; //No escribe lo de abajo si es par
echo " es impar"."\n";
}
?>
Estas son las estructuras de control más habituales en PHP que, como verás son similares
a las de otros lenguajes de programación. Seguro que no te resulta difícil dominarlas.
Cuando definimos una función, permitimos que el conjunto de código contenido en ella
no tenga que escribirse cada vez que se va a utilizar, por lo que nuestros programas son
más ligeros y más fáciles de mantener. Como ya hemos comentado en otros puntos, es
deseable mantener un estilo de programación adecuado que facilite tanto la
revisión posterior de nuestro código como la comprensión del mismo por parte de otro
programador. El uso de funciones, siempre que se realice de forma correcta, contribuye
a este propósito.
Como sabemos, una función puede tener o no argumentos. Si los tiene, se indican
separados por comas. Cuando definimos la función indicamos los argumentos que se
pasarán y, cuando la llamamos desde el programa principal (o desde otra función),
instanciamos los valores con los que queremos que se ejecute. En PHP, la lista de
argumentos se puede pasar:
<?php
function EjemploCompleto ($valor, &$refe, $predet = "dos")
{
$refe = "Juntos, ".$valor. " para ".$predet;
return $predet;
}
$bebida = "café";
$cuantos = EjemploCompleto($bebida, $cad);
echo $cad."\n"; //Escribe “Juntos, café para dos”
echo $cuantos."\n"; //Escribe “dos”
$cad = "";
$cuantos = EjemploCompleto("Té", $cad, "tres");
echo $cad."\n"; //Escribe “Juntos, té para tres”
echo $cuantos."\n"; //Escribe “tres”
?>
Un array es un conjunto de datos del mismo tipo que se almacenan de forma contigua
en memoria y se acceden mediante un nombre común. Cada uno de los elementos
contenidos en dicha estructura de memoria se accede por medio de un índice. Esta
definición es común para (casi) todos los lenguajes de programación. Sin embargo, PHP
tiene una ventaja adicional: los arrays son muy flexibles, lo cual facilita mucho el manejo
de memoria y permite distintas opciones para crear los índices.
Para declarar una array, solo tendremos que escribir un par de corchetes al final del
nombre de la variable.
<?php
$var[] = 5; //Crea un array e inserta el número 5
echo $var[0]; //Imprime un 5
?>
<?php
// Declaramos un vector que almacena el número de veces que se examina
// un alumno del carné de conducir
$var["Pepe"] = 3;
$var["María"] = 2;
?>
Sin embargo, PHP ofrece funciones que nos permiten manejar los arrays de forma
sencilla, ya que nos permiten acceder a sus propiedades y manejar su flexibilidad que
ofrecen. Para ello, utilizaremos el constructor array(), de la siguiente forma:
<?php
$miArray = array ("Antonio", "José", "Alberto");
?>
El ejemplo anterior, se crea un array con tres elementos, que ocupan las posiciones 0, 1
y 2 del vector respectivamente. No obstante, el constructor array() permite también que
se pasen como argumentos pares (índice, valor), de la siguiente manera:
<?php
$miArray = array (
0 => "Ana",
1 => "María",
5 => "Rosario"
);
?>
También se permite que las claves sean mixtas, es decir, que haya índices
numéricos y de cadena de caracteres:
<?php
$otroArray = array (
0 => "Ana",
1 => "María",
"Rosario" => "Charo"
);
?>
Además, PHP permite que los arrays sean multidimensionales, de tal forma que
podemos generar matrices y en general, poliedros, añadiendo dimensiones. Para
declarar arrays multidimensionales, solo tendremos que colocar un par de corchetes
por cada una de las dimensiones que queramos manejar.
<?php
$multiArray = array (
0 => array(
0 => "María",
1 => "Charo"
)
);
?>
Además, PHP proporciona un conjunto de funciones muy útiles que nos permiten
acceder a las características. Aunque hay muchas más, aquí destacamos las más
importantes, por su utilidad:
Las cadenas de caracteres no son más que variables que almacenan textos, donde cada
carácter ocupa un byte. En PHP, las cadenas de caracteres se pueden encerrar entre
comillas simples o dobles, aunque hay una ligera diferencia entre ellas:
Otra forma de especificar cadenas de caracteres, tal como se explicó en el tema anterior,
es utilizando bloques heredoc.
PHP proporciona un conjunto de operadores que nos permiten trabajar con las
cadenas de texto. Es especialmente importante el operador de concatenación, que en este
lenguaje se especifica con un ".". También se puede acceder a un carácter particular de
la cadena mediante el uso de llaves {}, utilizando el índice de la posición que ocupan, de
forma similar a como se haría en un array.
Sin embargo, al igual que ocurría con los arrays, PHP proporciona funciones para
trabajar con las cadenas de forma sencilla. Tal como hicimos en el apartado anterior,
a continuación destacamos las funciones más útiles para el trabajo de cadenas en PHP:
Seguro que estas funciones te resultarán muy útiles cuando trabajes con cadenas de
texto. Si necesitas hacer alguna operación que no aparece en este listado, revisa los
siguientes enlaces ya que solo hemos puesto aquí las más utilizadas, pero hay otras
muchas muy específicas que te pueden ayudar en problemas concretos.
Puedes ampliar esta información, ver más ejemplos y ampliar dudas el aula virtual o en
las siguientes direcciones web:
http://php.net/manual/es/language.types.string.php
http://php.net/manual/es/book.strings.php
Puedes ampliar esta información, ver más ejemplos y despejar dudas a través del aula
virtual o desde la siguiente página web:
http://php.net/manual/es/language.oop5.php
El uso de clases en PHP, como en cualquier otro entorno, permite obtener un conjunto
de ventajas que dan mayor calidad a nuestro código y lo hacen más fácilmente
mantenible y reutilizable. Además, si colocamos nuestras clases en un mismo fichero, o
bien, en distintos ficheros agrupadas según algún criterio, permitimos que nuestro
código sea, además, más legible.
Para definir una clase en PHP se utiliza la palabra reservada class, seguida del nombre
que vamos a dar a dicha clase y un conjunto de variables, constantes y funciones, que
estarán contenidas entre un par de llaves. A las variables y constantes las llamaremos
propiedades; a las funciones, métodos.
<?php
class ClaseEjemplo{
//Aquí van las propiedades
public $propiedad1 = "Primera propiedad";
public $propiedad2 = "Segunda propiedad";
» Las propiedades se han declarado de ámbito público, por lo que podrían accederse
sin necesidad de usar un método para ello. Si se declaran de ámbito protegido
(protected), solo pueden accederse desde la propia clase, las clases que heredan de
ella o la clase de la que hereda la clase que las define. Finalmente, si se declaran de
ámbito privado (private), solo pueden ser accedidas desde la clase donde se
definen.
» La función getPropiedad1() devuelve el valor de la propiedad $propiedad1 por medio
de la pseudo-variable $this. Siempre utilizaremos esta pseudo-variable de la misma
forma: antecedida por $ y seguida por ->.
También podemos definir constantes para una clase. La diferencia con las propiedades
es que no se anteceden del símbolo del dólar para declararlas ni utilizarlas. Y es habitual
darles nombres escritos en mayúscula.
<?php
$objetoEjemplo = new ClaseEjemplo();
?>
Es importante comentar que, desde PHP 5, los objetos se tratan como referencias,
es decir, cuando se asigna un objeto a una variable, no se hace una copia del objeto, sino
que se asigna su referencia.
<?php
class OtraClaseEjemplo extends ClaseEjemplo{
public $propiedad3 = "Propiedad añadida";
También es importante mencionar que tanto los constructores como los destructores
pueden sobrecargarse para forzar, por ejemplo, una inicialización antes de usar un
objeto, o viceversa.
<?php
class unaClase{
function __construct(){
//Se hace algo...
}
}
?>
<?php
class unaClase{
function __destruct(){
//Se hace algo...
}
}
?>
Algunas propiedades y objetos pueden declararse como static, lo cual significa que
pueden accederse sin necesidad de instanciar la clase. Estas propiedades tienen
algunas particularidades, derivadas del hecho de que no necesitan utilizarse por medio
de un objeto:
» Solo se pueden inicializar con un string literal o una constante, no con una expresión.
Esto implica que no se pueden inicializar con una variable o el valor devuelto por una
función.
» No pueden ser accedidas desde un objeto utilizando el operador ->, tal como hacíamos
con sus propiedades.
En PHP también podemos definir clases abstractas, lo cual implica que no pueden
instanciarse hasta que no se implemente sus métodos en las sub-clases (las que
heredan). En esta definición de los métodos abstractos, es necesario tener en cuenta la
visibilidad de los mismos, ya que hay que conservar la definición de la super-clase (la
clase madre); tienen que tener la misma visibilidad u otra menos restrictiva, nunca más
restrictiva que en el método abstracto.
Para definir una clase o un método como abstracta, utilizaremos la palabra reservada
abstract antes de class.
<?php
abstract class ClaseAbstracta{
abstract protected function unMetodo();
abstract public function otroMetodo();
que llamará al __clone() del objeto, si es posible. Si no, realizará una copia de las
propiedades del objeto. Esto puede ser un problema si nuestro objeto tiene referencias,
ya que el nuevo objeto copiará esas mismas referencias y por tanto, ambas instancias
trabajarán sobre la misma referencia. En estos casos, será necesario definir nuestro
propio __clone(), que realizará algunas tareas que requieran un tratamiento especial no
contemplado en el método de clonación por defecto. A continuación presentamos un
ejemplo.
<?php
class unaClase
{
static $nInstancias = 0;
public $instancia;
class ClaseClonable
{
public $objeto1;
public $objeto2;
function __clone()
{
//Para que no haga referencia al mismo objeto
$this->objecto1 = clone $this->objecto1;
}
}
El resultado de este ejemplo sería el siguiente (este y otros ejemplos pueden encontrarse
en la página web indicada al principio de este apartado):
Contenido de $obj:
$obj.objeto1.instancia = 1
$obj.objeto2.instancia = 2
» objeto1 de $obj2 es uno distinto del objeto1 de $obj, por lo que tiene un número
nuevo de instancia
» objeto2, al no aparecer en el método de clonación de la clase ClaseClonable, es el
mismo que el de $obj, por lo que tiene su mismo número de instancia, es decir, el 2.
Lo + recomendado
No dejes de ver…
Clases en PHP
Puedes acceder al vídeo a través del aula virtual o desde la siguiente dirección:
https://www.youtube.com/watch?v=rP-hyl9Jh3Q
+ Información
A fondo
Funciones variables
Php. Funciones variables. Manual de PHP [en línea]. [fecha de consulta: 1 Septiembre
2015].
En el apartado 2.3. hemos hablado de funciones. Con objeto de introducir una visión
general de cómo funciona el lenguaje PHP, se han presentado los conceptos más
importantes de cada uno de los ítems. Sin embargo, PHP permite lo que se conoce como
funciones variables, lo cual permite asignar a variables el nombre de la función que
quieres utilizar. Es una opción que te puede resultar interesante. Puedes ver en qué
consiste y cómo se usa en el siguiente manual.
Accede al manual a través del aula virtual o desde de la siguiente dirección web:
http://php.net/manual/es/functions.variable-functions.php
Funciones de Clases/Objetos
En PHP hay algunas funciones que se definen sobre los propios objetos y clases, que nos
dan información sobre las clases que hemos definido, sus métodos, las interfaces, etc. Es
un conjunto de funciones que nos dan acceso a meta-información que, en ocasiones,
puede resultar muy útil.
Accede al manual a través del aula virtual o desde de la siguiente dirección web:
http://php.net/manual/es/ref.classobj.php
Enlaces relacionados
PHP a fondo
En estos primeros temas, hemos dado una visión general de los elementos básicos del
lenguaje PHP. Sin embargo, siempre necesitamos alguna función adicional o una visión
distinta de cómo hacer algo que se nos está resistiendo. Con objeto de facilitarte la labor
en estas situaciones, pensamos que el enlace que te proponemos te puede ayudar, ya que
presenta un conjunto de secciones, muy bien estructuradas, que te permiten encontrar
fácilmente los contenidos que necesitas. Seguro que te será de utilidad en tus desarrollos.
Accede la página web a través del aula virtual o desde de la siguiente dirección web:
http://www.desarrolloweb.com/php/
Funciones parte 3
Es posible que tengas algunas dificultades para entender las diferencias entre el paso de
parámetros por valor, por referencia y por defecto. A continuación, te dejamos un enlace
donde puedes recordar, de forma sencilla y con ejemplos, las diferencias entre cada una
de estas formas de paso de argumentos.
Accede a la página web a través del aula virtual o desde de la siguiente dirección web:
http://www.aulafacil.com/cursos/l19305/informatica/programacion/php-
basico/funciones-parte-3-parametros-por-valor-por-referencia-y-por-defecto
Bibliografía
Actividades
En esta actividad se propone desarrollar una página web en PHP de temática libre. El
desarrollo se hará poniendo en práctica los conceptos estudiados en los dos primeros
temas. Por tanto, los requisitos mínimos serían los siguientes:
Se deberá entregar un máximo de dos ficheros en los que se incluya el código que
implementa los requisitos indicados en el enunciado. También se debe incluir una
captura de pantalla del resultado de la página web desarrollada, visto en el navegador.
Competencias
CB6- Poseer y comprender conocimientos que aporten una base u oportunidad de ser
originales en el desarrollo y/o aplicación de ideas, a menudo en un contexto de
investigación.
CB10- Que los estudiantes posean las habilidades de aprendizaje que les permitan
continuar estudiando de un modo que habrá de ser en gran medida autodirigido o
autónomo.
Test
2. Los bucles que en todos los casos ejecutan una vez el código que incluyen son:
A. Los do…while.
B. Los while.
C. Los foreach.