Diferencia entre revisiones de «PHP Reutilización de código: Include / Require»
Ir a la navegación
Ir a la búsqueda
| Línea 255: | Línea 255: | ||
: '''Páxina utilidades/utilidades1.inc.php''' | : '''Páxina utilidades/utilidades1.inc.php''' | ||
| − | ::<syntaxhighlight lang=" | + | ::<syntaxhighlight lang="php" line highlight="" > |
<?php | <?php | ||
function engadirCadeaAoArray(&$array, $cadea) { | function engadirCadeaAoArray(&$array, $cadea) { | ||
| Línea 271: | Línea 271: | ||
: '''Páxina exercicio1_include.php''' | : '''Páxina exercicio1_include.php''' | ||
| − | ::<syntaxhighlight lang=" | + | ::<syntaxhighlight lang="php" line highlight="" > |
<!DOCTYPE html> | <!DOCTYPE html> | ||
<html lang="gl"> | <html lang="gl"> | ||
| Línea 315: | Línea 315: | ||
:'''Páxina utilidades/utilidades2.inc.php''' | :'''Páxina utilidades/utilidades2.inc.php''' | ||
| − | ::<syntaxhighlight lang=" | + | ::<syntaxhighlight lang="php" line highlight="" > |
<?php | <?php | ||
// Definimos as constantes | // Definimos as constantes | ||
| Línea 349: | Línea 349: | ||
:'''Páxina exercicio2_include.php''' | :'''Páxina exercicio2_include.php''' | ||
| − | ::<syntaxhighlight lang=" | + | ::<syntaxhighlight lang="php" line highlight="" > |
<!DOCTYPE html> | <!DOCTYPE html> | ||
<html lang="gl"> | <html lang="gl"> | ||
| Línea 384: | Línea 384: | ||
| − | ::<syntaxhighlight lang=" | + | ::<syntaxhighlight lang="php" line enclose="div" highlight="" > |
</syntaxhighlight> | </syntaxhighlight> | ||
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016). | <br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016). | ||
Revisión del 07:22 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 todos os elementos son maiores que a constante edad_maior e que o número de elementos sexa inferior 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 da idade. 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 paxina 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
1 <?php 2 function engadirCadeaAoArray(&$array, $cadea) { 3 if (!in_array($cadea, $array)) { 4 $array[] = $cadea; 5 } 6 } 7 8 function copiarArray($array) { 9 return array_copy($array); 10 } 11 ?>
- Páxina exercicio1_include.php
1 <!DOCTYPE html> 2 <html lang="gl"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Exemplo PHP en Galego</title> 6 </head> 7 <body> 8 <?php 9 require('utilidades/utilidades1.inc.php'); // Incluímos o arquivo de utilidades 10 11 $meuArray = array(); // Array global 12 13 // Engadir cadea ao array 14 engadirCadeaAoArray($meuArray, "Hola"); 15 engadirCadeaAoArray($meuArray, "Mundo"); 16 engadirCadeaAoArray($meuArray, "Hola"); // Esta cadea xa existe, non se engadirá novamente 17 18 // Copiar o array 19 $copiaArray = copiarArray($meuArray); 20 21 // Mostrar o array orixinal 22 echo "<h2>Array Orixinal:</h2>"; 23 echo "<pre>"; 24 print_r($meuArray); 25 echo "</pre>"; 26 27 // Mostrar a copia do array 28 echo "<h2>Copia do Array:</h2>"; 29 echo "<pre>"; 30 print_r($copiaArray); 31 echo "</pre>"; 32 ?> 33 </body> 34 </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 todos os elementos son maiores que a constante edad_maior e que o número de elementos sexa inferior 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 da idade. 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 paxina necesita cargar obrigatoriamente o arquivo de utilidades2.
- Páxina utilidades/utilidades2.inc.php
1 <?php 2 // Definimos as constantes 3 define("NUM_ELEMENTOS", 3); 4 define("EDAD_MAIOR", 18); 5 6 // Definimos a función para comprobar a idade dos elementos nun array 7 function comprobarIdade($array) { 8 // Inicializamos un array para gardar os elementos que cumpran a condición 9 $elementosCumpridos = array(); 10 11 // Comprobamos se o número de elementos no array é inferior a NUM_ELEMENTOS 12 if (count($array) < NUM_ELEMENTOS) { 13 // Comprobamos a idade de cada elemento 14 foreach ($array as $idade) { 15 if ($idade > EDAD_MAIOR) { 16 $elementosCumpridos[] = $idade; 17 } 18 } 19 20 // Se hai elementos que cumpran a condición, devolvemos o array 21 if (!empty($elementosCumpridos)) { 22 return $elementosCumpridos; 23 } 24 } 25 26 // Se non cumprir as condicións, devolvemos false 27 return false; 28 } 29 ?>
- Páxina exercicio2_include.php
1 <!DOCTYPE html> 2 <html lang="gl"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Exemplo PHP en Galego</title> 6 </head> 7 <body> 8 <?php 9 require_once('utilidades/utilidades2.inc.php'); // Incluímos o arquivo de utilidades2 10 11 // Exemplo de array de idades 12 $idades = array(20, 15, 25, 12, 30); 13 14 $resultado = comprobarIdade($idades); 15 16 if ($resultado !== false) { 17 echo "<h2>Idades cumprindo a condición:</h2>"; 18 echo "<ul>"; 19 foreach ($resultado as $idade) { 20 echo "<li>$idade anos</li>"; 21 } 22 echo "</ul>"; 23 } else { 24 echo "<h2>Ningúnha idade cumple a condición</h2>"; 25 } 26 ?> 27 </body> 28 </html>
-- Ángel D. Fernández González -- (2016).