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

De MediaWiki
Ir a la navegación Ir a la búsqueda
(Página creada con «== Introdución == * Cando programamos pode darse o caso de que teñamos un código (ven en forma de funcións, constantes ou bloque de código) que teñamos que utilizar...»)
 
(No se muestran 5 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, 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 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.
  
  
Línea 7: Línea 7:
  
 
* Isto o conseguimos coas ordes: '''include''', '''include_once''', '''require''' e '''require_once'''.
 
* Isto o conseguimos coas ordes: '''include''', '''include_once''', '''require''' e '''require_once'''.
 +
 
== Include ==
 
== Include ==
  
* A sentenza include inclúe e avalía o arquivo especificado.
+
* <u>Sintaxe:</u> include('[path/]arquivo.inc.php');
 +
 
 +
* A sentenza 'include' inclúe e avalía o arquivo especificado.
  
 
* A sintaxe é:
 
* A sintaxe é:
Línea 28: Línea 31:
  
 
     /*
 
     /*
     * Función que crea un array cun número de elementos indicado no paráemtro
+
     * Función que crea un array cun número de elementos indicado no parámetro
 
     *  Os inicializa ao valor null
 
     *  Os inicializa ao valor null
 
     * Parámetros:
 
     * Parámetros:
Línea 61: Línea 64:
 
          
 
          
 
         foreach ($datos as $clave => $dato){
 
         foreach ($datos as $clave => $dato){
             printf("Clave:%d - Valor:%s<br />",$clave,$valor);
+
             printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor);
 
         }
 
         }
 
          
 
          
Línea 68: Línea 71:
 
</html>
 
</html>
 
</syntaxhighlight>  
 
</syntaxhighlight>  
 +
 +
: 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 <b>fora</b> 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 ==
  
 +
* <u>Sintaxe:</u> 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 [http://wiki.cifprodolfoucha.es/index.php?title=PHP_Conceptos_b%C3%A1sicos_Modelo-Vista-Controlador#Opci.C3.B3n_2 neste enlace da WIKI].
 +
 +
 +
== require ==
 +
 +
* <u>Sintaxe:</u> 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:
 +
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="9" >
 +
<!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
 +
    include ("./FuncionsExternasNonExiste.inc.php");
 +
?>
 +
    <body>
 +
        <?php
 +
 +
          echo "Isto aparece...";
 +
        ?>
 +
    </body>   
 +
</html>
 +
</syntaxhighlight>
 +
 +
: Dará como resultado:
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="5" >
 +
Warning: include(./FuncionsExternasNonExiste.inc.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.inc.php' for inclusion (include_path='.;C:\php\pear') in C:\xampp\htdocs\phpArrays\ReutilizarCodigo.php on line 9
 +
 +
Isto aparece...
 +
</syntaxhighlight>
 +
 +
== require_once ==
 +
 +
* <u>Sintaxe:</u> 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 [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].
 +
 +
: Por exemplo, podemos facer que que so aparezan os erros e non os warning´s no exercicio anterior desta forma:
 +
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="9" >
 +
<!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.inc.php');
 +
?>
 +
    <body>
 +
        <?php
 +
 +
          echo "Isto aparece...";
 +
        /*
 +
        $datos = crearArray(10);
 +
       
 +
        foreach ($datos as $clave => $dato){
 +
            printf("Clave:%d - Valor:%s<br />",$clave,$valor==null ? 'Sen dato':$valor);
 +
        }
 +
        */
 +
        ?>
 +
    </body>   
 +
</html>
 +
</syntaxhighlight>
 +
 +
 +
* Outros exemplos:
 +
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
// 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 ...)
 +
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
 +
 +
 +
// Notificar todolos erros excepto E_NOTICE
 +
error_reporting(E_ALL ^ E_NOTICE);
 +
</syntaxhighlight>
 +
 +
=== 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á:
 +
 +
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
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].
  
  
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016).
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2016).

Revisión del 18:54 22 mar 2017

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.



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