Diferencia entre revisiones de «PHP Reutilización de código: Include / Require»

De MediaWiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
==Introdución==
 
==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.
+
* Cando programamos pode darse o caso de que teñamos código (funcións, variables, constantes ou bloques de código) que teñamos que utilizar en moitas páxinas distintas.
  
 +
* Nestes casos é conveniente ter ese código gardado nun arquivo separado e poder incorporalo cando o necesitemos.
  
−
* Nestes casos é conveniente ter o código 'gardado' non arquivo separado e que poidamos utilizalo cando o necesitemos.
+
* En PHP podemos facelo coas construcións da linguaxe: '''include''', '''include_once''', '''require''' e '''require_once'''.
  
−
* Isto o conseguimos coas ordes: '''include''', '''include_once''', '''require''' e '''require_once'''.
 
  
 
==Include==
 
==Include==
  
−
* <u>Sintaxe:</u> include('[path/]arquivo.php');
+
* <u>Sintaxe:</u>
  
−
* A sentenza 'include' inclúe e avalía o arquivo especificado.
+
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
include '[path/]arquivo.php';
 +
</syntaxhighlight>
 +
 
 +
* A sentenza '''include''' inclúe e avalía o arquivo indicado.
 +
 
 +
* A ruta pode ser absoluta ou relativa. Para evitar problemas coa resolución de rutas é recomendable construír a ruta a partir da constante máxica '''__DIR__''', que representa o directorio no que se atopa o arquivo PHP actual.
 +
 
 +
: Por exemplo:
 +
 
 +
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
include __DIR__ . '/utilidades/arquivo.php';
 +
</syntaxhighlight>
  
−
* A sintaxe é:
+
* Antigamente empregábase ás veces a extensión ''.inc.php'' para este tipo de arquivos, pero actualmente non é necesaria. É habitual empregar simplemente a extensión ''.php''.
−
::<syntaxhighlight lang="java" enclose="div" highlight="" >
 
−
include "[path/]nomearquivo.php";
 
−
</syntaxhighlight>
 
  
−
: 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.
+
* O código PHP do arquivo incluído debe atoparse entre etiquetas PHP.
  
−
* Antigamento se empregaba a extensión .inc.php para este tipo de arquivos, pero actualmente xa non se recomenda.
+
: Se o arquivo contén unicamente código PHP, é recomendable empregar a etiqueta de apertura <code>&lt;?php</code> e omitir a etiqueta de peche <code>?&gt;</code> ao final do arquivo.
  
−
* O arquivo include '''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.
+
: Desta forma evítase que espazos ou saltos de liña situados accidentalmente despois da etiqueta de peche produzan unha saída non desexada.
  
 
* Vexamos un exemplo:
 
* Vexamos un exemplo:
 +
 
: '''Arquivo: FuncionsExternas.php'''
 
: '''Arquivo: FuncionsExternas.php'''
−
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
+
 
 +
::<syntaxhighlight lang="php" line enclose="div" highlight="">
 
<?php
 
<?php
  
−
        /**
+
/**
−
        * Crea un array cun número específico de elementos inicializados a null.
+
* Crea un array cun número específico de elementos inicializados a null.
−
        *
+
*
−
        * Esta función xera un array co número de elementos indicado:
+
* @param int $numElementos Número de elementos que terá o array.
−
        * - Cada elemento do array será inicializado a `null`.
+
*
−
        *
+
* @return array Array co número de elementos indicado, todos con valor null.
−
        * @param int $numElementos Número de elementos que terá o array.
+
*/
−
        *
+
function crearArray(int $numElementos): array
−
        * @return array Array co número de elementos indicado, todos con valor `null`.
+
{
−
        */
+
    $array = [];
−
        function crearArray(int $numElementos): array {
+
 
−
            $array = array();
+
    for ($cont = 0; $cont < $numElementos; $cont++) {
−
            for ($cont = 0; $cont < $numElementos; $cont++) {
+
        $array[$cont] = null;
−
                $array[$cont] = null;
+
    }
−
            }
 
−
            return $array;
 
−
        }
 
  
−
?>
+
    return $array;
−
</syntaxhighlight>  
+
}
 +
</syntaxhighlight>
  
 +
: '''Arquivo: ReutilizandoCodigo.php'''
  
−
: '''Arquivo: ReutilzandoCodigo.php'''
+
::<syntaxhighlight lang="php" line enclose="div" highlight="9,11">
−
::<syntaxhighlight lang="java" line enclose="div" highlight="9,13" >
+
<!DOCTYPE html>
−
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+
<html lang="gl">
−
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<head>
−
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
+
    <meta charset="UTF-8">
−
    <head>
+
    <title>Exemplo de reutilización de código</title>
−
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
</head>
−
        <title>Exemplos de códigos php</title>
+
<body>
−
    </head>
 
 
<?php
 
<?php
−
    include ("./FuncionsExternas.php");
+
include __DIR__ . '/FuncionsExternas.php';
 +
 
 +
$datos = crearArray(10);
 +
 
 +
foreach ($datos as $clave => $dato) {
 +
    printf(
 +
        "Clave:%d - Valor:%s<br>",
 +
        $clave,
 +
        $dato === null ? 'Sen dato' : $dato
 +
    );
 +
}
 
?>
 
?>
−
    <body>
+
</body>
−
        <?php
 
−
        $datos = crearArray(10);
 
−
       
 
−
        foreach ($datos as $clave => $dato){
 
−
            printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor);
 
−
        }
 
−
       
 
−
        ?>
 
−
    </body>  
 
 
</html>
 
</html>
−
</syntaxhighlight>  
+
</syntaxhighlight>
 +
 
 +
* Todas as funcións e clases definidas nun arquivo incluído teñen ámbito global.
 +
 
 +
* No caso das variables, o arquivo incluído herda o ámbito do punto no que se realiza a inclusión.
 +
 
 +
: Por exemplo, se facemos un '''include''' dentro dunha función, as variables definidas no arquivo incluído pertencerán ao ámbito desa función.
 +
 
 +
* Cando fagamos unha aplicación con acceso a unha base de datos teremos normalmente información sensible, como credenciais de conexión.
 +
 
 +
: É unha boa práctica gardar esa información fóra do directorio público do servidor web.
 +
 
 +
:: Imaxinemos que o servidor web publica por defecto o cartafol:
 +
 
 +
::<syntaxhighlight lang="text">
 +
/var/www/html
 +
</syntaxhighlight>
  
−
: Todas as funcións e clases definidas nun arquivo include teñen un ámbito global.
+
:: Poderiamos gardar un arquivo de configuración, por exemplo, en:
  
−
* 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.
+
::<syntaxhighlight lang="text">
−
: Será unha boa idea gardar ditos datos nun arquivo <b>fora</b> da ruta onde apunte o servidor web.
+
/var/www/configuracions/informacionbd.php
−
:: Imaxinemos que o noso servidor web apunta por defecto a este cartafol: /var/www/html
+
</syntaxhighlight>
−
:: 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.
 
  
 +
: Desta forma o arquivo non pode ser solicitado directamente mediante unha URL coa configuración habitual do servidor web.
  
 
==include_once==
 
==include_once==
  
−
* <u>Sintaxe:</u> include_once('[path/]arquivo.php');
+
* <u>Sintaxe:</u>
 +
 
 +
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
include_once __DIR__ . '/arquivo.php';
 +
</syntaxhighlight>
 +
 
 +
* '''include_once''' ten o mesmo comportamento que '''include''', pero PHP comproba se o arquivo xa foi incluído previamente. Se xa foi incluído, non volve procesalo.
 +
 
 +
: Isto é especialmente útil cando o arquivo define funcións, clases ou constantes, xa que incluílo máis dunha vez podería provocar erros por declaracións duplicadas.
  
−
* É 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,...)
+
* Debemos escoller entre '''include''' e '''include_once''' en función de se queremos permitir ou non que o mesmo arquivo sexa procesado máis dunha vez.
  
−
* Computacionalmente custa bastante polo que debemos limitar o seu uso.
+
* Pode ser útil cando realizamos inclusións condicionais (por exemplo, dentro dun '''if''') e non sabemos con certeza se o arquivo xa foi cargado 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 includes, ademais de utilizarse para gardar funcións, constantes ou variables, poden empregarse para ter elementos comúns a todas as páxinas dun sitio web e non repetir o mesmo código.
  
 +
: Por exemplo, unha cabeceira, un menú ou un pé de páxina.
  
−
* 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.
+
: Desta forma, se necesitamos cambiar un destes elementos, só teremos que modificalo nun arquivo.
−
: 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 tamén podemos empregar outros patróns para estruturar os elementos comúns dunha aplicación.
  
−
* 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].
 
: 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 110: Línea 141:
 
==require==
 
==require==
  
−
* <u>Sintaxe:</u> require '[path/]arquivo.php';
+
* <u>Sintaxe:</u>
 +
 
 +
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
require __DIR__ . '/arquivo.php';
 +
</syntaxhighlight>
 +
 
 +
* '''require''' inclúe e avalía un arquivo do mesmo xeito que '''include'''.
  
−
* 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.
+
* A diferenza importante aparece cando PHP non pode cargar o arquivo:
  
−
: Isto non pasa con 'include'. Daría un warning pero seguiría executando o script e cargando a páxina.
+
:* '''include''' produce un aviso de tipo '''E_WARNING''' e a execución do script pode continuar.
 +
:* '''require''' produce un erro de tipo '''Error''' e, se non se trata, interrómpese a execución do script.
  
−
* Vexamos un exemplo:
+
* Por este motivo empregaremos normalmente '''require''' cando o arquivo sexa imprescindible para que a aplicación poida funcionar.
 +
 
 +
=== Comparación entre include e require ===
 +
 
 +
: Podemos resumir o seu uso da seguinte forma:
 +
 
 +
{| class="wikitable"
 +
! Sentenza !! Uso habitual
 +
|-
 +
| '''include''' || O arquivo é opcional. Se falla, a execución pode continuar.
 +
|-
 +
| '''require''' || O arquivo é necesario. Se falla, a execución interrómpese se o erro non se trata.
 +
|-
 +
| '''include_once''' || O arquivo é opcional e só debe procesarse unha vez.
 +
|-
 +
| '''require_once''' || O arquivo é necesario e só debe procesarse unha vez.
 +
|}
 +
 
 +
=== Exemplo con include ===
  
−
::<syntaxhighlight lang="java" line enclose="div" highlight="9" >
+
::<syntaxhighlight lang="php" line enclose="div" highlight="9">
−
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+
<!DOCTYPE html>
−
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
<html lang="gl">
−
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
+
<head>
−
    <head>
+
    <meta charset="UTF-8">
−
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
    <title>Exemplo include</title>
−
        <title>Exemplos de códigos php</title>
+
</head>
−
    </head>
+
<body>
 
<?php
 
<?php
−
    include ("./FuncionsExternasNonExiste.php");
+
include __DIR__ . '/FuncionsExternasNonExiste.php';
 +
 
 +
echo 'Isto aparece porque include permite continuar.';
 
?>
 
?>
−
    <body>
+
</body>
−
        <?php
+
</html>
 +
</syntaxhighlight>
  
−
          echo "Isto aparece...";
+
: Se o arquivo non existe, PHP amosará un warning, pero a mensaxe posterior poderá executarse.
−
        ?>
 
−
    </body>   
 
−
</html>
 
−
</syntaxhighlight>
 
  
−
: Dará como resultado:
+
=== Exemplo con require ===
−
::<syntaxhighlight lang="java" line enclose="div" highlight="5" >
 
−
Warning: include(./FuncionsExternasNonExiste.php): failed to open stream: No such file or directory in C:\xampp\htdocs\phpArrays\ReutilizarCodigo.php on line 9
 
  
−
Warning: include(): Failed opening './FuncionsExternasNonExiste.php' for inclusion (include_path='.;C:\php\pear') in C:\xampp\htdocs\phpArrays\ReutilizarCodigo.php on line 9
+
::<syntaxhighlight lang="php" line enclose="div" highlight="9">
 +
<!DOCTYPE html>
 +
<html lang="gl">
 +
<head>
 +
    <meta charset="UTF-8">
 +
    <title>Exemplo require</title>
 +
</head>
 +
<body>
 +
<?php
 +
require __DIR__ . '/FuncionsExternasNonExiste.php';
  
−
Isto aparece...  
+
echo 'Esta instrución non chegará a executarse se o erro non se trata.';
 +
?>
 +
</body>
 +
</html>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
==require_once==
 
==require_once==
  
−
* <u>Sintaxe:</u> require_once '[path/]arquivo.php';
+
* <u>Sintaxe:</u>
  
−
* 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.
+
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
require_once __DIR__ . '/arquivo.php';
 +
</syntaxhighlight>
  
 +
* Ten o mesmo comportamento que '''require''', pero se o arquivo xa foi incluído previamente non o volve procesar.
  
−
==Eliminando os warnings / erros que xera o PHP==
+
* É unha opción habitual para cargar arquivos imprescindibles que definen funcións, clases, constantes ou configuracións que só deben declararse unha vez.
  
−
* 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 ===
+
==Configuración da visualización e rexistro de erros==
  
−
:* Coa [http://php.net/manual/es/function.error-reporting.php función error_reporting] facendo uso das [http://php.net/manual/es/errorfunc.constants.php constantes predefinidas].
+
* Durante o desenvolvemento é útil que PHP informe dos erros, warnings e mensaxes de depreciación para poder corrixilos.
  
−
: Por exemplo, podemos facer que que so aparezan os erros e non os warning´s no exercicio anterior desta forma:
+
* Nun servidor de produción non debemos amosar os erros directamente ao usuario, xa que poderían revelar información sensible da aplicación ou do servidor.
  
−
::<syntaxhighlight lang="java" line enclose="div" highlight="9" >
+
=== Contorna de desenvolvemento ===
−
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 
−
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
−
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
 
−
    <head>
 
−
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
−
        <title>Exemplos de códigos php</title>
 
−
    </head>
 
−
<?php
 
−
    error_reporting(E_ERROR);
 
−
    include('./FuncionsExternasNonExiste.php');
 
−
?>
 
−
    <body>
 
−
        <?php
 
  
−
          echo "Isto aparece...";
+
* Durante o desenvolvemento podemos solicitar que PHP informe de todos os erros:
−
        /*
 
−
        $datos = crearArray(10);
 
−
       
 
−
        foreach ($datos as $clave => $dato){
 
−
            printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor);
 
−
        }
 
−
        */
 
−
        ?>
 
−
    </body>   
 
−
</html>
 
−
</syntaxhighlight>
 
  
 +
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
error_reporting(E_ALL);
 +
ini_set('display_errors', '1');
 +
</syntaxhighlight>
  
−
* Outros exemplos:
+
* '''E_ALL''' inclúe todos os niveis de erro dispoñibles na versión actual de PHP.
  
−
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
+
* O obxectivo non debe ser ocultar os warnings ou notices durante o desenvolvemento, senón detectalos e corrixilos.
−
// Notificar erros, warnings e erros de análises.
 
−
error_reporting(E_ERROR | E_WARNING | E_PARSE);
 
  
−
// Notificar E_NOTICE implica informar de variables non inicializadas o capturar erros en nome de variables ...)
+
=== Contorna de produción ===
−
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
 
−
 
  
−
// Notificar todolos erros excepto E_NOTICE
+
* En produción é recomendable non amosar os erros na saída HTML e gardalos no rexistro de erros do servidor.
−
error_reporting(E_ALL ^ E_NOTICE);
 
−
</syntaxhighlight>
 
  
−
===A través do arquivo .htaccess===
+
: Unha configuración típica en '''php.ini''' sería:
  
−
* Normalmente, cando estamos non aloxamento compartido non imos poder ter acceso á configuración do apache e modificalo para que non apareza os erros.
+
::<syntaxhighlight lang="ini" enclose="div" highlight="">
 +
error_reporting = E_ALL
 +
display_errors = Off
 +
log_errors = On
 +
</syntaxhighlight>
  
−
* Para facelo, podemos modificar ou crear un arquivo de nome '''.htaccess''' no cartafol onde estea 'apuntando' o servidor web.
+
* Desta forma os erros poden quedar rexistrados para a súa análise sen expoñelos ao usuario final.
−
: O contido será:
 
  
−
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
+
=== Selección de niveis de erro ===
−
php_value error_reporting valor_numérico
 
−
php_flag display_errors On
 
−
</syntaxhighlight>
 
  
−
: 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].
+
* PHP permite combinar constantes de erro empregando operadores de bits.
  
 +
: Por exemplo:
  
 +
::<syntaxhighlight lang="php" enclose="div" highlight="">
 +
// Informar de erros, warnings e erros de análise.
 +
error_reporting(E_ERROR | E_WARNING | E_PARSE);
  
−
<br />
+
// Todos os erros excepto E_NOTICE.
−
==Colocar arquivos sensibles==
+
error_reporting(E_ALL & ~E_NOTICE);
 +
</syntaxhighlight>
  
−
* Veremos nas seguintes unidades de que imos ter que gardar información 'sensible' en certos arquivos php, como os datos para poder conectarnos a unha base de datos.
+
: Aínda que é posible seleccionar niveis concretos, durante o desenvolvemento é recomendable empregar '''E_ALL'''.
−
: Dita información a teremos definida nun arquivo php, como por exemplo, informacionbd.php, que incorporaremos cun require a cada unha das páxinas que van conectarse á base de datos.
 
  
−
: Para que non se poida acceder a dita información dende o navegador, imos colocala fisicamente nun cartafol fora da ruta onde apunte o servidor apache.
+
=== A través do arquivo .htaccess cando PHP funciona como módulo de Apache ===
−
: Por exemplo, por defecto o servidor apache apunta ao cartafol /var/www/html
 
−
: Se cremoa un cartafol e poñemos o arquivo de información en /var/www/'''configuracions/informacionbd.php''', dende Apache nunca poderemos cargar ou acceder directamente a dita páxina.
 
  
 +
* Se PHP se executa como módulo de Apache e a configuración do servidor o permite, é posible modificar determinadas opcións de PHP mediante o arquivo '''.htaccess'''.
  
 +
: Por exemplo:
  
−
<br />
+
::<syntaxhighlight lang="apache" enclose="div" highlight="">
−
==Exercicios propostos==
+
php_value error_reporting 2147483647
 +
php_flag display_errors On
 +
</syntaxhighlight>
  
−
* '''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).  
+
* Esta forma de configuración non é válida para todas as formas de executar PHP.
  
 +
: Por exemplo, cando PHP se executa mediante CGI/FastCGI pódense empregar arquivos '''.user.ini''' para determinadas opcións de configuración.
  
  
 +
==Colocar arquivos sensibles==
  
−
* '''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.
+
* En unidades posteriores teremos que gardar información sensible, como os datos necesarios para conectarnos a unha base de datos.
−
 
 
−
 
 
  
 +
* Unha boa práctica é colocar estes arquivos fóra do '''DocumentRoot''' do servidor web, é dicir, fóra do directorio que pode ser solicitado directamente mediante unha URL.
  
 +
: Por exemplo, se Apache publica:
  
 +
::<syntaxhighlight lang="text">
 +
/var/www/html
 +
</syntaxhighlight>
  
 +
: podemos gardar a configuración en:
  
 +
::<syntaxhighlight lang="text">
 +
/var/www/configuracions/informacionbd.php
 +
</syntaxhighlight>
  
 +
: e cargala dende as páxinas necesarias mediante:
  
 +
::<syntaxhighlight lang="php">
 +
require __DIR__ . '/../configuracions/informacionbd.php';
 +
</syntaxhighlight>
  
 +
* Ademais de estar fóra do directorio público, o arquivo debe ter permisos de acceso adecuados.
  
 +
* Non debemos gardar contrasinais ou credenciais sensibles nun repositorio público.
  
  
 +
<br />
 +
==Exercicios propostos==
  
 +
* '''Exercicio 1:''' Define nun arquivo externo dentro dun cartafol de nome '''utilidades''' dúas funcións: unha que, a partir 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 para que a páxina funcione.
  
  
 +
* '''Exercicio 2:''' Define nun arquivo externo de nome '''utilidades2.php''' dentro do cartafol '''utilidades''' as seguintes constantes: '''NUM_ELEMENTOS''' igual a 3 e '''IDADE_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'''.
  
 +
: Se non cumpre a condición, a función debe devolver '''false'''.
  
 +
: En caso contrario, debe devolver un array cos datos que cumpran a condición de seren maiores que '''IDADE_MAIOR'''. Se non existe ningún elemento 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 incluído previamente. Para funcionar, a páxina necesita cargar obrigatoriamente o arquivo '''utilidades2.php'''.
  
  
Línea 270: Línea 339:
 
=== Solución Exercicios propostos ===
 
=== 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).
+
* '''Solución Exercicio 1:'''
  
 
: '''Páxina utilidades/utilidades1.php'''
 
: '''Páxina utilidades/utilidades1.php'''
−
::<syntaxhighlight lang="php" highlight="" >
+
 
 +
::<syntaxhighlight lang="php" highlight="">
 
<?php
 
<?php
 +
 
/**
 
/**
 
  * Engade unha cadea ao array se non existe xa.
 
  * Engade unha cadea ao array se non existe xa.
−
*
 
−
* Esta función recibe un array por referencia e unha cadea de texto. 
 
−
* - Se a cadea non está xa presente no array, engádese ao final.
 
 
  *
 
  *
 
  * @param array  &$array Array onde se engadirá a cadea.
 
  * @param array  &$array Array onde se engadirá a cadea.
 
  * @param string $cadea  Cadea de texto a engadir.
 
  * @param string $cadea  Cadea de texto a engadir.
 
  *
 
  *
−
  * @return void A función non devolve ningún valor; modifica directamente o array pasado por referencia.
+
  * @return void
 
  */
 
  */
−
function engadirCadeaAoArray(array &$array, string $cadea): void {
+
function engadirCadeaAoArray(array &$array, string $cadea): void
−
     if (!in_array($cadea, $array)) {
+
{
 +
     if (!in_array($cadea, $array, true)) {
 
         $array[] = $cadea;
 
         $array[] = $cadea;
 
     }
 
     }
Línea 293: Línea 362:
  
 
/**
 
/**
−
  * Copia un array.
+
  * Devolve unha copia dun array.
 
  *
 
  *
−
  * Esta función debería devolver unha copia do array recibido. 
+
  * En PHP os arrays asígnanse por valor. Polo tanto, devolver o array
−
  * (Nota: Pódese empregar `array_merge([], $array)` ou `array_slice($array)`.)
+
* permite obter unha copia que pode modificarse sen alterar o array
 +
  * orixinal, salvo que se empreguen referencias de forma explícita.
 
  *
 
  *
 
  * @param array $array Array que se quere copiar.
 
  * @param array $array Array que se quere copiar.
 
  *
 
  *
−
  * @return array Nova copia do array recibido.
+
  * @return array Copia do array recibido.
 
  */
 
  */
−
function copiarArray(array $array): array {
+
function copiarArray(array $array): array
−
    // Usar array_slice para copiar correctamente
+
{
−
     return array_slice($array, 0);
+
     return $array;
 
}
 
}
 +
</syntaxhighlight>
  
−
?>
+
: '''Páxina exercicio1_include.php'''
−
</syntaxhighlight>
 
−
 
 
  
−
: '''Páxina exercicio1_include.php'''
+
::<syntaxhighlight lang="php" highlight="">
−
::<syntaxhighlight lang="php" highlight="" >
 
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
<html lang="gl">
 
<html lang="gl">
 
<head>
 
<head>
 
     <meta charset="UTF-8">
 
     <meta charset="UTF-8">
−
     <title>Exemplo PHP en Galego</title>
+
     <title>Exemplo de include</title>
 
</head>
 
</head>
 
<body>
 
<body>
 
<?php
 
<?php
−
require('utilidades/utilidades1.php'); // Incluímos o arquivo de utilidades
+
require __DIR__ . '/utilidades/utilidades1.php';
  
−
$meuArray = array(); // Array global
+
$meuArray = [];
  
−
// Engadir cadea ao array
+
// Engadir cadeas ao array.
−
engadirCadeaAoArray($meuArray, "Hola");
+
engadirCadeaAoArray($meuArray, 'Ola');
−
engadirCadeaAoArray($meuArray, "Mundo");
+
engadirCadeaAoArray($meuArray, 'Mundo');
−
engadirCadeaAoArray($meuArray, "Hola"); // Esta cadea xa existe, non se engadirá novamente
+
engadirCadeaAoArray($meuArray, 'Ola'); // Xa existe, non se engade de novo.
  
−
// Copiar o array
+
// Copiar o array.
 
$copiaArray = copiarArray($meuArray);
 
$copiaArray = copiarArray($meuArray);
  
−
// Mostrar o array orixinal
+
// Modificamos a copia para comprobar que o orixinal non cambia.
−
echo "<h2>Array Orixinal:</h2>";
+
$copiaArray[] = 'Novo dato';
−
echo "<pre>";
+
 
 +
// Amosar o array orixinal.
 +
echo '<h2>Array orixinal:</h2>';
 +
echo '<pre>';
 
print_r($meuArray);
 
print_r($meuArray);
−
echo "</pre>";
+
echo '</pre>';
  
−
// Mostrar a copia do array
+
// Amosar a copia.
−
echo "<h2>Copia do Array:</h2>";
+
echo '<h2>Copia do array:</h2>';
−
echo "<pre>";
+
echo '<pre>';
 
print_r($copiaArray);
 
print_r($copiaArray);
−
echo "</pre>";
+
echo '</pre>';
 
?>
 
?>
 
</body>
 
</body>
 
</html>
 
</html>
 +
</syntaxhighlight>
  
−
</syntaxhighlight>
 
  
 +
<br />
 +
* '''Solución Exercicio 2:'''
  
 +
: '''Páxina utilidades/utilidades2.php'''
  
−
<br />
+
::<syntaxhighlight lang="php" highlight="">
−
* '''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.
+
<?php
  
−
:'''Páxina utilidades/utilidades2.php'''
+
const NUM_ELEMENTOS = 3;
−
::<syntaxhighlight lang="php" highlight="" >
+
const IDADE_MAIOR = 18;
−
<?php
 
−
// Definimos as constantes
 
−
define("NUM_ELEMENTOS", 3);
 
−
define("EDAD_MAIOR", 18);
 
  
 
/**
 
/**
 
  * Comproba as idades dun array e devolve os elementos que superen un límite.
 
  * Comproba as idades dun array e devolve os elementos que superen un límite.
−
*
 
−
* Esta función realiza os seguintes pasos:
 
−
* 1. Comproba se o número de elementos no array é maior que `NUM_ELEMENTOS`.
 
−
* 2. Se se cumpre, recolle todos os valores que sexan maiores que `EDAD_MAIOR`.
 
−
* 3. Se hai elementos que cumpren a condición, devolve un array con eles.
 
−
* 4. Se non se cumpren as condicións, devolve `false`.
 
 
  *
 
  *
 
  * @param array $array Array de números (idades) a comprobar.
 
  * @param array $array Array de números (idades) a comprobar.
 
  *
 
  *
−
  * @return array|false Devolve un array cos elementos que superan `EDAD_MAIOR`, ou `false` se non hai ningunha coincidencia ou non se cumpre o tamaño mínimo.
+
  * @return array|false Devolve un array cos elementos maiores que IDADE_MAIOR,
 +
*                    ou false se non hai coincidencias ou non se cumpre
 +
*                    o tamaño mínimo.
 
  */
 
  */
−
function comprobarIdade(array $array): array|false {
+
function comprobarIdade(array $array): array|false
−
     // Inicializamos un array para gardar os elementos que cumpran a condición
+
{
−
    $elementosCumpridos = array();
+
     if (count($array) <= NUM_ELEMENTOS) {
 +
        return false;
 +
    }
  
−
     // Comprobamos se o número de elementos no array é superior a NUM_ELEMENTOS
+
     $elementosCumpridos = [];
−
    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
+
    foreach ($array as $idade) {
−
         if (!empty($elementosCumpridos)) {
+
         if ($idade > IDADE_MAIOR) {
−
             return $elementosCumpridos;
+
             $elementosCumpridos[] = $idade;
 
         }
 
         }
 
     }
 
     }
  
−
    // Se non cumprir as condicións, devolvemos false
+
     return $elementosCumpridos !== [] ? $elementosCumpridos : false;
−
     return false;
 
 
}
 
}
 +
</syntaxhighlight>
  
−
?>
+
: '''Páxina exercicio2_include.php'''
−
</syntaxhighlight>
 
  
−
:'''Páxina exercicio2_include.php'''
+
::<syntaxhighlight lang="php" highlight="">
−
::<syntaxhighlight lang="php" highlight="" >
 
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
<html lang="gl">
 
<html lang="gl">
 
<head>
 
<head>
 
     <meta charset="UTF-8">
 
     <meta charset="UTF-8">
−
     <title>Exemplo PHP en Galego</title>
+
     <title>Exemplo de require_once</title>
 
</head>
 
</head>
 
<body>
 
<body>
 
<?php
 
<?php
−
require_once('utilidades/utilidades2.php'); // Incluímos o arquivo de utilidades2
+
require_once __DIR__ . '/utilidades/utilidades2.php';
  
−
// Exemplo de array de idades
+
$idades = [2, 62, 2, 2, 2]; // Soamente 62 cumpre a condición.
−
$idades = array(2, 62, 2 , 2, 2);   // Soamente 62 cumpre a condición
 
  
 
$resultado = comprobarIdade($idades);
 
$resultado = comprobarIdade($idades);
  
 
if ($resultado !== false) {
 
if ($resultado !== false) {
−
     echo "<h2>Idades cumprindo a condición:</h2>";
+
     echo '<h2>Idades que cumpren a condición:</h2>';
−
     echo "<ul>";
+
     echo '<ul>';
 +
 
 
     foreach ($resultado as $idade) {
 
     foreach ($resultado as $idade) {
 
         echo "<li>$idade anos</li>";
 
         echo "<li>$idade anos</li>";
 
     }
 
     }
−
     echo "</ul>";
+
 
 +
     echo '</ul>';
 
} else {
 
} else {
−
     echo "<h2>Ningúnha idade cumple a condición</h2>";
+
     echo '<h2>Ningunha idade cumpre a condición</h2>';
 
}
 
}
 
?>
 
?>
 
</body>
 
</body>
 
</html>
 
</html>
−
 
+
</syntaxhighlight>
−
</syntaxhighlight>  
 
−
 
 
−
 
 
−
 
 
  
  
−
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2025).
+
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2026).

Revisión actual del 16:37 13 sep 2026

Introdución

  • Cando programamos pode darse o caso de que teñamos código (funcións, variables, constantes ou bloques de código) que teñamos que utilizar en moitas páxinas distintas.
  • Nestes casos é conveniente ter ese código gardado nun arquivo separado e poder incorporalo cando o necesitemos.
  • En PHP podemos facelo coas construcións da linguaxe: include, include_once, require e require_once.


Include

  • Sintaxe:
include '[path/]arquivo.php';
  • A sentenza include inclúe e avalía o arquivo indicado.
  • A ruta pode ser absoluta ou relativa. Para evitar problemas coa resolución de rutas é recomendable construír a ruta a partir da constante máxica __DIR__, que representa o directorio no que se atopa o arquivo PHP actual.
Por exemplo:
include __DIR__ . '/utilidades/arquivo.php';
  • Antigamente empregábase ás veces a extensión .inc.php para este tipo de arquivos, pero actualmente non é necesaria. É habitual empregar simplemente a extensión .php.
  • O código PHP do arquivo incluído debe atoparse entre etiquetas PHP.
Se o arquivo contén unicamente código PHP, é recomendable empregar a etiqueta de apertura <?php e omitir a etiqueta de peche ?> ao final do arquivo.
Desta forma evítase que espazos ou saltos de liña situados accidentalmente despois da etiqueta de peche produzan unha saída non desexada.
  • Vexamos un exemplo:
Arquivo: FuncionsExternas.php
 1 <?php
 2 
 3 /**
 4  * Crea un array cun número específico de elementos inicializados a null.
 5  *
 6  * @param int $numElementos Número de elementos que terá o array.
 7  *
 8  * @return array Array co número de elementos indicado, todos con valor null.
 9  */
10 function crearArray(int $numElementos): array
11 {
12     $array = [];
13 
14     for ($cont = 0; $cont < $numElementos; $cont++) {
15         $array[$cont] = null;
16     }
17 
18     return $array;
19 }
Arquivo: ReutilizandoCodigo.php
 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplo de reutilización de código</title>
 6 </head>
 7 <body>
 8 <?php
 9 include __DIR__ . '/FuncionsExternas.php';
10 
11 $datos = crearArray(10);
12 
13 foreach ($datos as $clave => $dato) {
14     printf(
15         "Clave:%d - Valor:%s<br>",
16         $clave,
17         $dato === null ? 'Sen dato' : $dato
18     );
19 }
20 ?>
21 </body>
22 </html>
  • Todas as funcións e clases definidas nun arquivo incluído teñen ámbito global.
  • No caso das variables, o arquivo incluído herda o ámbito do punto no que se realiza a inclusión.
Por exemplo, se facemos un include dentro dunha función, as variables definidas no arquivo incluído pertencerán ao ámbito desa función.
  • Cando fagamos unha aplicación con acceso a unha base de datos teremos normalmente información sensible, como credenciais de conexión.
É unha boa práctica gardar esa información fóra do directorio público do servidor web.
Imaxinemos que o servidor web publica por defecto o cartafol:
/var/www/html
Poderiamos gardar un arquivo de configuración, por exemplo, en:
/var/www/configuracions/informacionbd.php
Desta forma o arquivo non pode ser solicitado directamente mediante unha URL coa configuración habitual do servidor web.

include_once

  • Sintaxe:
include_once __DIR__ . '/arquivo.php';
  • include_once ten o mesmo comportamento que include, pero PHP comproba se o arquivo xa foi incluído previamente. Se xa foi incluído, non volve procesalo.
Isto é especialmente útil cando o arquivo define funcións, clases ou constantes, xa que incluílo máis dunha vez podería provocar erros por declaracións duplicadas.
  • Debemos escoller entre include e include_once en función de se queremos permitir ou non que o mesmo arquivo sexa procesado máis dunha vez.
  • Pode ser útil cando realizamos inclusións condicionais (por exemplo, dentro dun if) e non sabemos con certeza se o arquivo xa foi cargado anteriormente.


  • Os includes, ademais de utilizarse para gardar funcións, constantes ou variables, poden empregarse para ter elementos comúns a todas as páxinas dun sitio web e non repetir o mesmo código.
Por exemplo, unha cabeceira, un menú ou un pé de páxina.
Desta forma, se necesitamos cambiar un destes elementos, só teremos que modificalo nun arquivo.
  • En PHP tamén podemos empregar outros patróns para estruturar os elementos comúns dunha aplicación.
Podedes consultalo neste enlace da WIKI.


require

  • Sintaxe:
require __DIR__ . '/arquivo.php';
  • require inclúe e avalía un arquivo do mesmo xeito que include.
  • A diferenza importante aparece cando PHP non pode cargar o arquivo:
  • include produce un aviso de tipo E_WARNING e a execución do script pode continuar.
  • require produce un erro de tipo Error e, se non se trata, interrómpese a execución do script.
  • Por este motivo empregaremos normalmente require cando o arquivo sexa imprescindible para que a aplicación poida funcionar.

Comparación entre include e require

Podemos resumir o seu uso da seguinte forma:
Sentenza Uso habitual
include O arquivo é opcional. Se falla, a execución pode continuar.
require O arquivo é necesario. Se falla, a execución interrómpese se o erro non se trata.
include_once O arquivo é opcional e só debe procesarse unha vez.
require_once O arquivo é necesario e só debe procesarse unha vez.

Exemplo con include

 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplo include</title>
 6 </head>
 7 <body>
 8 <?php
 9 include __DIR__ . '/FuncionsExternasNonExiste.php';
10 
11 echo 'Isto aparece porque include permite continuar.';
12 ?>
13 </body>
14 </html>
Se o arquivo non existe, PHP amosará un warning, pero a mensaxe posterior poderá executarse.

Exemplo con require

 1 <!DOCTYPE html>
 2 <html lang="gl">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Exemplo require</title>
 6 </head>
 7 <body>
 8 <?php
 9 require __DIR__ . '/FuncionsExternasNonExiste.php';
10 
11 echo 'Esta instrución non chegará a executarse se o erro non se trata.';
12 ?>
13 </body>
14 </html>

require_once

  • Sintaxe:
require_once __DIR__ . '/arquivo.php';
  • Ten o mesmo comportamento que require, pero se o arquivo xa foi incluído previamente non o volve procesar.
  • É unha opción habitual para cargar arquivos imprescindibles que definen funcións, clases, constantes ou configuracións que só deben declararse unha vez.


Configuración da visualización e rexistro de erros

  • Durante o desenvolvemento é útil que PHP informe dos erros, warnings e mensaxes de depreciación para poder corrixilos.
  • Nun servidor de produción non debemos amosar os erros directamente ao usuario, xa que poderían revelar información sensible da aplicación ou do servidor.

Contorna de desenvolvemento

  • Durante o desenvolvemento podemos solicitar que PHP informe de todos os erros:
error_reporting(E_ALL);
ini_set('display_errors', '1');
  • E_ALL inclúe todos os niveis de erro dispoñibles na versión actual de PHP.
  • O obxectivo non debe ser ocultar os warnings ou notices durante o desenvolvemento, senón detectalos e corrixilos.

Contorna de produción

  • En produción é recomendable non amosar os erros na saída HTML e gardalos no rexistro de erros do servidor.
Unha configuración típica en php.ini sería:
error_reporting = E_ALL
display_errors = Off
log_errors = On
  • Desta forma os erros poden quedar rexistrados para a súa análise sen expoñelos ao usuario final.

Selección de niveis de erro

  • PHP permite combinar constantes de erro empregando operadores de bits.
Por exemplo:
// Informar de erros, warnings e erros de análise.
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Todos os erros excepto E_NOTICE.
error_reporting(E_ALL & ~E_NOTICE);
Aínda que é posible seleccionar niveis concretos, durante o desenvolvemento é recomendable empregar E_ALL.

A través do arquivo .htaccess cando PHP funciona como módulo de Apache

  • Se PHP se executa como módulo de Apache e a configuración do servidor o permite, é posible modificar determinadas opcións de PHP mediante o arquivo .htaccess.
Por exemplo:
php_value error_reporting 2147483647
php_flag display_errors On
  • Esta forma de configuración non é válida para todas as formas de executar PHP.
Por exemplo, cando PHP se executa mediante CGI/FastCGI pódense empregar arquivos .user.ini para determinadas opcións de configuración.


Colocar arquivos sensibles

  • En unidades posteriores teremos que gardar información sensible, como os datos necesarios para conectarnos a unha base de datos.
  • Unha boa práctica é colocar estes arquivos fóra do DocumentRoot do servidor web, é dicir, fóra do directorio que pode ser solicitado directamente mediante unha URL.
Por exemplo, se Apache publica:
/var/www/html
podemos gardar a configuración en:
/var/www/configuracions/informacionbd.php
e cargala dende as páxinas necesarias mediante:
require __DIR__ . '/../configuracions/informacionbd.php';
  • Ademais de estar fóra do directorio público, o arquivo debe ter permisos de acceso adecuados.
  • Non debemos gardar contrasinais ou credenciais sensibles nun repositorio público.



Exercicios propostos

  • Exercicio 1: Define nun arquivo externo dentro dun cartafol de nome utilidades dúas funcións: unha que, a partir 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 para que a páxina funcione.


  • Exercicio 2: Define nun arquivo externo de nome utilidades2.php dentro do cartafol utilidades as seguintes constantes: NUM_ELEMENTOS igual a 3 e IDADE_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.
Se non cumpre a condición, a función debe devolver false.
En caso contrario, debe devolver un array cos datos que cumpran a condición de seren maiores que IDADE_MAIOR. Se non existe ningún elemento 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 incluído previamente. Para funcionar, a páxina necesita cargar obrigatoriamente o arquivo utilidades2.php.



Solución Exercicios propostos

  • Solución Exercicio 1:
Páxina utilidades/utilidades1.php
<?php

/**
 * Engade unha cadea ao array se non existe xa.
 *
 * @param array  &$array Array onde se engadirá a cadea.
 * @param string $cadea  Cadea de texto a engadir.
 *
 * @return void
 */
function engadirCadeaAoArray(array &$array, string $cadea): void
{
    if (!in_array($cadea, $array, true)) {
        $array[] = $cadea;
    }
}

/**
 * Devolve unha copia dun array.
 *
 * En PHP os arrays asígnanse por valor. Polo tanto, devolver o array
 * permite obter unha copia que pode modificarse sen alterar o array
 * orixinal, salvo que se empreguen referencias de forma explícita.
 *
 * @param array $array Array que se quere copiar.
 *
 * @return array Copia do array recibido.
 */
function copiarArray(array $array): array
{
    return $array;
}
Páxina exercicio1_include.php
<!DOCTYPE html>
<html lang="gl">
<head>
    <meta charset="UTF-8">
    <title>Exemplo de include</title>
</head>
<body>
<?php
require __DIR__ . '/utilidades/utilidades1.php';

$meuArray = [];

// Engadir cadeas ao array.
engadirCadeaAoArray($meuArray, 'Ola');
engadirCadeaAoArray($meuArray, 'Mundo');
engadirCadeaAoArray($meuArray, 'Ola'); // Xa existe, non se engade de novo.

// Copiar o array.
$copiaArray = copiarArray($meuArray);

// Modificamos a copia para comprobar que o orixinal non cambia.
$copiaArray[] = 'Novo dato';

// Amosar o array orixinal.
echo '<h2>Array orixinal:</h2>';
echo '<pre>';
print_r($meuArray);
echo '</pre>';

// Amosar a copia.
echo '<h2>Copia do array:</h2>';
echo '<pre>';
print_r($copiaArray);
echo '</pre>';
?>
</body>
</html>



  • Solución Exercicio 2:
Páxina utilidades/utilidades2.php
<?php

const NUM_ELEMENTOS = 3;
const IDADE_MAIOR = 18;

/**
 * Comproba as idades dun array e devolve os elementos que superen un límite.
 *
 * @param array $array Array de números (idades) a comprobar.
 *
 * @return array|false Devolve un array cos elementos maiores que IDADE_MAIOR,
 *                     ou false se non hai coincidencias ou non se cumpre
 *                     o tamaño mínimo.
 */
function comprobarIdade(array $array): array|false
{
    if (count($array) <= NUM_ELEMENTOS) {
        return false;
    }

    $elementosCumpridos = [];

    foreach ($array as $idade) {
        if ($idade > IDADE_MAIOR) {
            $elementosCumpridos[] = $idade;
        }
    }

    return $elementosCumpridos !== [] ? $elementosCumpridos : false;
}
Páxina exercicio2_include.php
<!DOCTYPE html>
<html lang="gl">
<head>
    <meta charset="UTF-8">
    <title>Exemplo de require_once</title>
</head>
<body>
<?php
require_once __DIR__ . '/utilidades/utilidades2.php';

$idades = [2, 62, 2, 2, 2]; // Soamente 62 cumpre a condición.

$resultado = comprobarIdade($idades);

if ($resultado !== false) {
    echo '<h2>Idades que cumpren a condición:</h2>';
    echo '<ul>';

    foreach ($resultado as $idade) {
        echo "<li>$idade anos</li>";
    }

    echo '</ul>';
} else {
    echo '<h2>Ningunha idade cumpre a condición</h2>';
}
?>
</body>
</html>



-- Ángel D. Fernández González -- (2026).