Diferencia entre revisiones de «PHP Reutilización de código: Include / Require»
Ir a la navegación
Ir a la búsqueda
(No se muestran 7 ediciones intermedias de 2 usuarios) | |||
Línea 90: | Línea 90: | ||
* Pode darse o caso cando facemos include´s de forma condicional (dentro dun if) no que poida que xa foran cargados os arquivos anteriormente. | * Pode darse o caso cando facemos include´s de forma condicional (dentro dun if) no que poida que xa foran cargados os arquivos anteriormente. | ||
+ | |||
+ | |||
+ | |||
+ | * Os include, a maiores de utilizarse para gardar funcións, constantes ou variables, poden usarse para ter aqueles elementos comúns a todas as páxinas webs do sitio web e non ter que estar a repetir o mesmo código en todas elas. | ||
+ | : Por exemplo, todos os sitios contan cun menú e unha cabeceira que soe ser a mesma. | ||
+ | : O lóxico será ter definido en arquivos include o código dese menú e esa cabeceira e facer un include en todas as páxinas do sitios. | ||
+ | : Desta forma, se necesitamos cambiar algo soamente teríamos que facelo nun arquivo. | ||
+ | |||
+ | |||
+ | * En PHP existe outra forma de facer un 'modelo' cos elementos comúns e que despois todas as páxinas teñan o contido dese modelo máis o seu propio. | ||
+ | : Podedes consultalo [http://wiki.cifprodolfoucha.es/index.php?title=PHP_Conceptos_b%C3%A1sicos_Modelo-Vista-Controlador#Opci.C3.B3n_2 neste enlace da WIKI]. | ||
Línea 129: | Línea 140: | ||
Isto aparece... | Isto aparece... | ||
− | </syntaxhighlight> | + | </syntaxhighlight> |
− | |||
== require_once == | == require_once == | ||
Línea 206: | Línea 216: | ||
: Sendo 'valor_numérico' un número integer que se corresponde a un valor da seguinte táboa: [http://www.php.net/manual/en/errorfunc.constants.php Táboa de constentes]. | : Sendo 'valor_numérico' un número integer que se corresponde a un valor da seguinte táboa: [http://www.php.net/manual/en/errorfunc.constants.php Táboa de constentes]. | ||
+ | |||
+ | |||
+ | <br /> | ||
+ | == Exercicios propostos == | ||
+ | |||
+ | * '''Exercicio 1:''' Define nun arquivo externo dentro dun cartafol de nome 'utilidades', duas funcións, unha que a partires dunha cadea, engada a un array dita cadea se non existe previamente, e outra función que dado un array devolva unha copia do array enviado. Xera unha páxina que faga uso das funcións do arquivo anterior (é obrigatorio que exista dito arquivo). | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * '''Exercicio 2:''' Define nun arquivo externo de nome utilidades2 dentro do cartafol utilidades as seguintes constantes: NUM_ELEMENTOS igual a 3, EDAD_MAIOR igual a 18. Crea tamén unha función que dado un array numérico comprobe que o número de elementos do array sexa superior a num_elementos. En caso de que non cumpra as condicións a función debe devolver false. En caso contrario debe devolver un array cos datos que cumpran a condición de que os elementos son maiores que a constante edad_maiore. En caso de que non haia ningún elemento do array que cumpra a condición, debe devolver false. Crea unha páxina de exemplo de uso da función anterior, tendo en conta que dita páxina pode xerarse dinamicamente e non vas saber se o arquivo foi incluido previamente. Para que funcione, a páxina necesita cargar obrigatoriamente o arquivo de utilidades2. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <br /> | ||
+ | === Solución Exercicios propostos === | ||
+ | |||
+ | * '''Exercicio 1:''' Define nun arquivo externo dentro dun cartafol de nome 'utilidades', duas funcións, unha que a partires dunha cadea, engada a un array dita cadea se non existe previamente, e outra función que dado un array devolva unha copia do array enviado. Xera unha páxina que faga uso das funcións do arquivo anterior (é obrigatorio que exista dito arquivo). | ||
+ | |||
+ | : '''Páxina utilidades/utilidades1.inc.php''' | ||
+ | ::<syntaxhighlight lang="php" highlight="" > | ||
+ | <?php | ||
+ | function engadirCadeaAoArray(&$array, $cadea) { | ||
+ | if (!in_array($cadea, $array)) { | ||
+ | $array[] = $cadea; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function copiarArray($array) { | ||
+ | return array_copy($array); | ||
+ | } | ||
+ | ?> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | : '''Páxina exercicio1_include.php''' | ||
+ | ::<syntaxhighlight lang="php" highlight="" > | ||
+ | <!DOCTYPE html> | ||
+ | <html lang="gl"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title>Exemplo PHP en Galego</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | require('utilidades/utilidades1.inc.php'); // Incluímos o arquivo de utilidades | ||
+ | |||
+ | $meuArray = array(); // Array global | ||
+ | |||
+ | // Engadir cadea ao array | ||
+ | engadirCadeaAoArray($meuArray, "Hola"); | ||
+ | engadirCadeaAoArray($meuArray, "Mundo"); | ||
+ | engadirCadeaAoArray($meuArray, "Hola"); // Esta cadea xa existe, non se engadirá novamente | ||
+ | |||
+ | // Copiar o array | ||
+ | $copiaArray = copiarArray($meuArray); | ||
+ | |||
+ | // Mostrar o array orixinal | ||
+ | echo "<h2>Array Orixinal:</h2>"; | ||
+ | echo "<pre>"; | ||
+ | print_r($meuArray); | ||
+ | echo "</pre>"; | ||
+ | |||
+ | // Mostrar a copia do array | ||
+ | echo "<h2>Copia do Array:</h2>"; | ||
+ | echo "<pre>"; | ||
+ | print_r($copiaArray); | ||
+ | echo "</pre>"; | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | |||
+ | <br /> | ||
+ | * '''Solución Exercicio 2:''' Define nun arquivo externo de nome utilidades2 dentro do cartafol utilidades as seguintes constantes: NUM_ELEMENTOS igual a 3, EDAD_MAIOR igual a 18. Crea tamén unha función que dado un array numérico comprobe que o número de elementos do array sexa superior a num_elementos. En caso de que non cumpra as condicións a función debe devolver false. En caso contrario debe devolver un array cos datos que cumpran a condición de que os elementos son maiores que a constante edad_maiore. En caso de que non haia ningún elemento do array que cumpra a condición, debe devolver false. Crea unha páxina de exemplo de uso da función anterior, tendo en conta que dita páxina pode xerarse dinamicamente e non vas saber se o arquivo foi incluido previamente. Para que funcione, a páxina necesita cargar obrigatoriamente o arquivo de utilidades2. | ||
+ | |||
+ | :'''Páxina utilidades/utilidades2.inc.php''' | ||
+ | ::<syntaxhighlight lang="php" highlight="" > | ||
+ | <?php | ||
+ | // Definimos as constantes | ||
+ | define("NUM_ELEMENTOS", 3); | ||
+ | define("EDAD_MAIOR", 18); | ||
+ | |||
+ | // Definimos a función para comprobar a idade dos elementos nun array | ||
+ | function comprobarIdade($array) { | ||
+ | // Inicializamos un array para gardar os elementos que cumpran a condición | ||
+ | $elementosCumpridos = array(); | ||
+ | |||
+ | // Comprobamos se o número de elementos no array é inferior a NUM_ELEMENTOS | ||
+ | if (count($array) > NUM_ELEMENTOS) { | ||
+ | // Comprobamos a idade de cada elemento | ||
+ | foreach ($array as $idade) { | ||
+ | if ($idade > EDAD_MAIOR) { | ||
+ | $elementosCumpridos[] = $idade; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Se hai elementos que cumpran a condición, devolvemos o array | ||
+ | if (!empty($elementosCumpridos)) { | ||
+ | return $elementosCumpridos; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Se non cumprir as condicións, devolvemos false | ||
+ | return false; | ||
+ | } | ||
+ | ?> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | :'''Páxina exercicio2_include.php''' | ||
+ | ::<syntaxhighlight lang="php" highlight="" > | ||
+ | <!DOCTYPE html> | ||
+ | <html lang="gl"> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title>Exemplo PHP en Galego</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | require_once('utilidades/utilidades2.inc.php'); // Incluímos o arquivo de utilidades2 | ||
+ | |||
+ | // Exemplo de array de idades | ||
+ | $idades = array(2, 62, 2 , 2, 2); // Soamente 62 cumpre a condición | ||
+ | |||
+ | $resultado = comprobarIdade($idades); | ||
+ | |||
+ | if ($resultado !== false) { | ||
+ | echo "<h2>Idades cumprindo a condición:</h2>"; | ||
+ | echo "<ul>"; | ||
+ | foreach ($resultado as $idade) { | ||
+ | echo "<li>$idade anos</li>"; | ||
+ | } | ||
+ | echo "</ul>"; | ||
+ | } else { | ||
+ | echo "<h2>Ningúnha idade cumple a condición</h2>"; | ||
+ | } | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ::<syntaxhighlight lang="php" enclose="div" highlight="" > | ||
+ | </syntaxhighlight> | ||
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016). | <br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016). |
Revisión actual del 07:30 25 sep 2023
Sumario
Introdución
- Cando programamos pode darse o caso de que teñamos un código (ven en forma de funcións, variables, constantes ou bloque de código) que teñamos que utilizar en moitas páxinas distintas.
- Nestes casos é conveniente ter o código 'gardado' non arquivo separado e que poidamos utilizalo cando o necesitemos.
- Isto o conseguimos coas ordes: include, include_once, require e require_once.
Include
- Sintaxe: include('[path/]arquivo.inc.php');
- A sentenza 'include' inclúe e avalía o arquivo especificado.
- A sintaxe é:
include "[path/]nomearquivo.inc.php";
- O [path] pode ser relativo ou absoluto. Se se fai relativo será con respecto ao cartafol onde se está a cargar o arquivo php que fai uso do include.
- Podedes atopar arquivos include coa extensión .inc, .php, pero para diferencialos dos arquivos php e para non dar pistas sobre o tipo de arquivo que estamos a utilizar usaremos a extensión .inc.php
- O arquivo .inc.php sempre deberá comezar e rematar coas etiquetas de php: <?php ?> xa que sempre cando facemos uso dun destes arquivos, abandona o modo php e ingresa no modo HTML.
- Vexamos un exemplo:
- Arquivo: FuncionsExternas.inc.php
1 <?php 2 3 /* 4 * Función que crea un array cun número de elementos indicado no parámetro 5 * Os inicializa ao valor null 6 * Parámetros: 7 * $numElementos:número de elementos do array 8 */ 9 function crearArray($numElementos){ 10 $array = array(); 11 for($cont=0;$cont<$numElementos;$cont++){ 12 $array[$cont]=null; 13 } 14 return $array; 15 } 16 ?>
- Arquivo: ReutilzandoCodigo.php
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <?php 9 include ("./FuncionsExternas.inc.php"); 10 ?> 11 <body> 12 <?php 13 $datos = crearArray(10); 14 15 foreach ($datos as $clave => $dato){ 16 printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor); 17 } 18 19 ?> 20 </body> 21 </html>
- Todas as funcións e clases definidas nun arquivo include teñen un ámbito global.
- Fixarse que cando fagamos unha aplicación con acceso a base de datos teremos que facer uso dun usuario/password para facer a conexión e tamén faremos uso de sentenzas SQL ou procedementos almacenados.
- Será unha boa idea gardar ditos datos nun arquivo fora da ruta onde apunte o servidor web.
- Imaxinemos que o noso servidor web apunta por defecto a este cartafol: /var/www/html
- Se as nosas páxinas php se atopan nese cartafol, podemos poñer nun arquivo (a información de login/password e consultas SQL) fora de dito cartafol, por exemplo en /var/www/informacion
- Desta forma ninguén vai poder acceder a dita información a través do servidor web xa que se atopa fora do seu alcance.
include_once
- Sintaxe: include_once('[path/]arquivo.inc.php');
- É unha variante da anterior orde. Fai o mesmo pero coa diferenza de que se incluímos dúas veces o mesmo arquivo, a sentenza anterior da un erro e esta non, xa que 'sabe' que dito arquivo foi cargado previamente o non o volve cargar (teríamos erros de funcións duplicadas,...)
- Computacionalmente custa bastante polo que debemos limitar o seu uso.
- Pode darse o caso cando facemos include´s de forma condicional (dentro dun if) no que poida que xa foran cargados os arquivos anteriormente.
- Os include, a maiores de utilizarse para gardar funcións, constantes ou variables, poden usarse para ter aqueles elementos comúns a todas as páxinas webs do sitio web e non ter que estar a repetir o mesmo código en todas elas.
- Por exemplo, todos os sitios contan cun menú e unha cabeceira que soe ser a mesma.
- O lóxico será ter definido en arquivos include o código dese menú e esa cabeceira e facer un include en todas as páxinas do sitios.
- Desta forma, se necesitamos cambiar algo soamente teríamos que facelo nun arquivo.
- En PHP existe outra forma de facer un 'modelo' cos elementos comúns e que despois todas as páxinas teñan o contido dese modelo máis o seu propio.
- Podedes consultalo neste enlace da WIKI.
require
- Sintaxe: require '[path/]arquivo.inc.php';
- Fai o mesmo que no caso de include coa diferenza que se dito arquivo non existe, dará un erro de tipo fatal error e se parará a execución do script.
- Isto non pasa con 'include'. Daría un warning pero seguiría executando o script e cargando a páxina.
- Vexamos un exemplo:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <?php 9 include ("./FuncionsExternasNonExiste.inc.php"); 10 ?> 11 <body> 12 <?php 13 14 echo "Isto aparece..."; 15 ?> 16 </body> 17 </html>
- Dará como resultado:
1 Warning: include(./FuncionsExternasNonExiste.inc.php): failed to open stream: No such file or directory in C:\xampp\htdocs\phpArrays\ReutilizarCodigo.php on line 9 2 3 Warning: include(): Failed opening './FuncionsExternasNonExiste.inc.php' for inclusion (include_path='.;C:\php\pear') in C:\xampp\htdocs\phpArrays\ReutilizarCodigo.php on line 9 4 5 Isto aparece...
require_once
- Sintaxe: require_once '[path/]arquivo.inc.php';
- Ten o mesmo efecto que require pero coa diferenza de que en caso de estar xa incluído o arquivo non vai volvelo a incluír.
Eliminando os warnings / erros que xera o PHP
- Nos exemplos anteriores puidemos comprobar como cando se xera un warning este aparece por pantalla ao usuario.
- Podemos modificar este comportamento de varias formas:
A través das páxinas PHP
- Coa función error_reporting facendo uso das constantes predefinidas.
- Por exemplo, podemos facer que que so aparezan os erros e non os warning´s no exercicio anterior desta forma:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title>Exemplos de códigos php</title> 7 </head> 8 <?php 9 error_reporting(E_ERROR); 10 include('./FuncionsExternasNonExiste.inc.php'); 11 ?> 12 <body> 13 <?php 14 15 echo "Isto aparece..."; 16 /* 17 $datos = crearArray(10); 18 19 foreach ($datos as $clave => $dato){ 20 printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor); 21 } 22 */ 23 ?> 24 </body> 25 </html>
- Outros exemplos:
1 // Notificar erros, warnings e erros de análises. 2 error_reporting(E_ERROR | E_WARNING | E_PARSE); 3 4 // Notificar E_NOTICE implica informar de variables non inicializadas o capturar erros en nome de variables ...) 5 error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 6 7 8 // Notificar todolos erros excepto E_NOTICE 9 error_reporting(E_ALL ^ E_NOTICE);
A través do arquivo .htaccess
- Normalmente, cando estamos non aloxamento compartido non imos poder ter acceso á configuración do apache e modificalo para que non apareza os erros.
- Para facelo, podemos modificar ou crear un arquivo de nome .htaccess no cartafol onde estea 'apuntando' o servidor web.
- O contido será:
1 php_value error_reporting valor_numérico 2 php_flag display_errors On
- Sendo 'valor_numérico' un número integer que se corresponde a un valor da seguinte táboa: Táboa de constentes.
Exercicios propostos
- Exercicio 1: Define nun arquivo externo dentro dun cartafol de nome 'utilidades', duas funcións, unha que a partires dunha cadea, engada a un array dita cadea se non existe previamente, e outra función que dado un array devolva unha copia do array enviado. Xera unha páxina que faga uso das funcións do arquivo anterior (é obrigatorio que exista dito arquivo).
- Exercicio 2: Define nun arquivo externo de nome utilidades2 dentro do cartafol utilidades as seguintes constantes: NUM_ELEMENTOS igual a 3, EDAD_MAIOR igual a 18. Crea tamén unha función que dado un array numérico comprobe que o número de elementos do array sexa superior a num_elementos. En caso de que non cumpra as condicións a función debe devolver false. En caso contrario debe devolver un array cos datos que cumpran a condición de que os elementos son maiores que a constante edad_maiore. En caso de que non haia ningún elemento do array que cumpra a condición, debe devolver false. Crea unha páxina de exemplo de uso da función anterior, tendo en conta que dita páxina pode xerarse dinamicamente e non vas saber se o arquivo foi incluido previamente. Para que funcione, a páxina necesita cargar obrigatoriamente o arquivo de utilidades2.
Solución Exercicios propostos
- Exercicio 1: Define nun arquivo externo dentro dun cartafol de nome 'utilidades', duas funcións, unha que a partires dunha cadea, engada a un array dita cadea se non existe previamente, e outra función que dado un array devolva unha copia do array enviado. Xera unha páxina que faga uso das funcións do arquivo anterior (é obrigatorio que exista dito arquivo).
- Páxina utilidades/utilidades1.inc.php
<?php function engadirCadeaAoArray(&$array, $cadea) { if (!in_array($cadea, $array)) { $array[] = $cadea; } } function copiarArray($array) { return array_copy($array); } ?>
- Páxina exercicio1_include.php
<!DOCTYPE html> <html lang="gl"> <head> <meta charset="UTF-8"> <title>Exemplo PHP en Galego</title> </head> <body> <?php require('utilidades/utilidades1.inc.php'); // Incluímos o arquivo de utilidades $meuArray = array(); // Array global // Engadir cadea ao array engadirCadeaAoArray($meuArray, "Hola"); engadirCadeaAoArray($meuArray, "Mundo"); engadirCadeaAoArray($meuArray, "Hola"); // Esta cadea xa existe, non se engadirá novamente // Copiar o array $copiaArray = copiarArray($meuArray); // Mostrar o array orixinal echo "<h2>Array Orixinal:</h2>"; echo "<pre>"; print_r($meuArray); echo "</pre>"; // Mostrar a copia do array echo "<h2>Copia do Array:</h2>"; echo "<pre>"; print_r($copiaArray); echo "</pre>"; ?> </body> </html>
- Solución Exercicio 2: Define nun arquivo externo de nome utilidades2 dentro do cartafol utilidades as seguintes constantes: NUM_ELEMENTOS igual a 3, EDAD_MAIOR igual a 18. Crea tamén unha función que dado un array numérico comprobe que o número de elementos do array sexa superior a num_elementos. En caso de que non cumpra as condicións a función debe devolver false. En caso contrario debe devolver un array cos datos que cumpran a condición de que os elementos son maiores que a constante edad_maiore. En caso de que non haia ningún elemento do array que cumpra a condición, debe devolver false. Crea unha páxina de exemplo de uso da función anterior, tendo en conta que dita páxina pode xerarse dinamicamente e non vas saber se o arquivo foi incluido previamente. Para que funcione, a páxina necesita cargar obrigatoriamente o arquivo de utilidades2.
- Páxina utilidades/utilidades2.inc.php
<?php // Definimos as constantes define("NUM_ELEMENTOS", 3); define("EDAD_MAIOR", 18); // Definimos a función para comprobar a idade dos elementos nun array function comprobarIdade($array) { // Inicializamos un array para gardar os elementos que cumpran a condición $elementosCumpridos = array(); // Comprobamos se o número de elementos no array é inferior a NUM_ELEMENTOS if (count($array) > NUM_ELEMENTOS) { // Comprobamos a idade de cada elemento foreach ($array as $idade) { if ($idade > EDAD_MAIOR) { $elementosCumpridos[] = $idade; } } // Se hai elementos que cumpran a condición, devolvemos o array if (!empty($elementosCumpridos)) { return $elementosCumpridos; } } // Se non cumprir as condicións, devolvemos false return false; } ?>
- Páxina exercicio2_include.php
<!DOCTYPE html> <html lang="gl"> <head> <meta charset="UTF-8"> <title>Exemplo PHP en Galego</title> </head> <body> <?php require_once('utilidades/utilidades2.inc.php'); // Incluímos o arquivo de utilidades2 // Exemplo de array de idades $idades = array(2, 62, 2 , 2, 2); // Soamente 62 cumpre a condición $resultado = comprobarIdade($idades); if ($resultado !== false) { echo "<h2>Idades cumprindo a condición:</h2>"; echo "<ul>"; foreach ($resultado as $idade) { echo "<li>$idade anos</li>"; } echo "</ul>"; } else { echo "<h2>Ningúnha idade cumple a condición</h2>"; } ?> </body> </html>
-- Ángel D. Fernández González -- (2016).