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 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

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

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).