Foros del Web » Programando para Internet » PHP »

Mal habito include_once() ?

Estas en el tema de Mal habito include_once() ? en el foro de PHP en Foros del Web. Amigos, siempre he utilizado, (creo que to2), el include(). Ahora haciendo un total Kmbio en mi web a razon de "aumentar" la seguridad, me sale ...
  #1 (permalink)  
Antiguo 16/04/2004, 08:09
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Mal habito include_once() ?

Amigos, siempre he utilizado, (creo que to2), el include().

Ahora haciendo un total Kmbio en mi web a razon de "aumentar" la seguridad, me sale cada rato el mensaje "no puedo REDECLARAR tal funcion... Etc...

El manual me dice:

Para que no te salga eso utiliza: require_once()

En efecto, si analizo la estructura de mi web, veo que a veces una variable termina siendo redeclarada 3,4 veces.

Por ejemplo:

index.php hace un include a header.php, y foro.php hace un header a index.php y tambien a header.php

Errores Fatales de principiante...

Con una @ al principio de cada instruccion puedo (creo), evitar esos errores, pero eso es (creo) mal habito de un programador PHP.

Sera tambien un mal habito acostumbrarme a include_once ?
Es inseguro include_once() ?
...Si include_once() es "maravillosa", (por que no REDECLARA variables inicializadas), podriamos decir que include() es obtuso ?
Es mal habito la @ ?

Parece como si include() es la version antigua y en desuso del "actualizado y apropiado" include_once().

Espero su tolerancia a mis especulaciones de aprendiz.
Gracias.
  #2 (permalink)  
Antiguo 16/04/2004, 08:34
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

El include_once() es una "red de seguridad" para que los programadores puedan ser despistados y permitir ciertas "licencias" que quizas implicarian una solucion un poco mas rebuscada.

Por ejemplo, tienes en include.php este codigo:
Código PHP:
function func($a) {
  return 
$a*2;

Y en index.php:
Código PHP:
include('include.php');
include(
'include.php'); 
Pues salta a la vista que es un error tener dos includes iguales en la misma pagina. Es decir, un fallo del programador. Usando include_once() ese fallo es inofensivo.

Esta claro que nadie va a poner dos include() seguidos. El problema suele aparecer cuando incluyes un fichero que incluye a su vez un tercero, y despues incluyes en la primera un cuarto que a su vez incluye el tercero. Entonces salta el error. Y puede que hayas incluido el tercero en el cuarto, poque el cuarto usa las funciones del tercero, y ademas de ser incluido en el primero, este cuarto es incluido en un sexto que no incluye el segundo. Posiblemente este ultimo parrafo sea ilegible del todo, ya que ni siquiera yo se cuantos ficheros he nombrado

Asi que si no quieres preocuparte de si incluyes el fichero varias veces usa include_once(). Si vas a controlar cuando se incluye cada fichero, usa include().

Posiblemente el include_once() fue una peticion de los programadores que estaban hasta las narices de usar el mismo truco que en C para despreocuparse de cuantas veces se incluia.

Por cierto, si quieres liarte un poco mas, tienes require() y require_once() que basicamente hacen lo mismo que include() e include_once().

Y el @ no es mal habito, siempre que lo uses con control y moderacion y solo cuando sabes que es seguro. Por cierto, @ no evita el error, solo evita que se muestre el mensaje de error. El error sigue existiendo.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 16/04/2004, 08:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
En efecto, si analizo la estructura de mi web, veo que a veces una variable termina siendo redeclarada 3,4 veces.
Mas que una variable .. lo que te "reclama" es por funciones declaradas varias veces .. Si estructurases tu sitio deacuerdo a los "include" que haces en cada uno y los que requieres en los que a su vez incrustras en otros no deberías de requerir el uso de include_once(), pero si haces scripts multipropósito que puedan ser accedidos de forma directa o bien bajo llamadas de otros scripts (por include()) ... ahí te hará falta el _once() ...

A todo esto .. también tienes el require() que es "mas seguro" si cabe que el include() (y también tienes el _once para este). El include proboca un error de "notice" si el archivo no se completó su carga .. el require() arroja un "Waring" si no se completó su carga por algún problema. Esto detiene la ejecución por completo del script .. mientras que el include() puede continuar la ejecución .. lo cual podría probocar algún error derivado de la no total carga del archivo en cuestión.

Los xxx_once() necesitan algo más de tiempo de proceso para evaluar si las funciones que ahí puedan contener ya están declaradas para no volverlas a declarar .. Por ende no es que sea mejor el "require_once()" .. sino que cada función de estas hay que usarlas donde corresponda.

Cita:
Con una @ al principio de cada instruccion puedo (creo), evitar esos errores, pero eso es (creo) mal habito de un programador PHP.
Esto no evita el error sino sólo lo "tapa" ocultando el mensaje de error posible pero no el error en sí. Es más si tubieras activado el reporte de errore en un log .. verías como tu archivo de log crece y crece ..

Por ejemplo ..

mal habito: tomar una variable externa de un script (que venga por GET/POST o sea una sesión/cookie entre otras sin verificar que existe .. en configuraciones de "error_reporting" (E_ALL) te diría que tal variable no está declarada en determinados casos.

Código PHP:
<?
echo @$_GET['variable'];
?>
buen habito:

Comprobar si existe dicha variable antes de usarla:

Código PHP:
<?
if (isset($_GET['variable'])){
// si existe .. se usa ..
echo $_GET['variable'];
}
?>
En cuanto a funciones también puedes comprobar si X función definida tuya (por tu código) o incluso própia de PHP existe o no (function_exists()) por si la requieres.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 16/04/2004, 08:57
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Fue que me equivoque:

Por ejemplo:

index.php hace un include a cabecera.php, y foro.php hace un INCLUDE a index.php y tambien a cabecera.php

si en cabecera.php tengo 50 variables asi:

$a = 'pp';
$b = 'bb';

etc...

Asi las cosas,
Un include es "desgastar, cansar" PHP ? (Por REDECLARAR varias veces las variables)
Un inlude_once es + ideal ?.

Supongamos que eres un profesor muy extricto, que instruirias utilizar a tus alumnos?

PD: phpMyAdmin-2.5.6 tiene 140 files con include() y solo 2 con include_once (en las librerias).

Con ese dato... Debiera sacar mis propias conlusiones?.

Gracias.
  #5 (permalink)  
Antiguo 16/04/2004, 09:18
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
De la respuesta sobre require() de Cluster mi cerebro dice:

Es > la seguridad con require.

He hice esto:

function pp ($a){$a = $a*5; return $a;}
if(!function_exists('pp')){function pp ($a){$a = $a*5; return $a;}}

Ta mal mi cerebelo ?
  #6 (permalink)  
Antiguo 16/04/2004, 09:21
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Veamos, un include() significa incluir el codigo del fichero dentro del principal. Asi que incluir 2 veces el mismo fichero es mas o menos lo mismo que escribir dos veces el mismo codigo:
Código PHP:
$a 'pp';
$b 'bb';

$a 'pp';
$b 'bb'
Es codigo valido, pero no bueno.

Lo normal es que un fichero solo se tenga que incluir una vez, asi que con include() valdria. Pero hay excepciones en que para simplificar las cosas un fichero se puede incluir varias veces, para esos casos son los include_once.

Pongamos un ejemplo. Tienes en funciones.php:
Código PHP:
function link($url,$texto) {
  return 
'<a href="'.$url.'">'.$texto.'</a>';

y luego tienes en listado_clientes.php:
Código PHP:
include('funciones.php');

$array=array('cliente1','cliente2');
foreach (
$array as $item) {
  echo 
link($item.'.html',$item);

Y mensajes.php
Código PHP:
include('funciones.php');

$array=array('mensaje1','mensaje2');
foreach (
$array as $item) {
  echo 
link('mensajes.php?id='.$item,$item);

Y listado_clientes.php lo incluyes en index, clientes y pedidos. Y mensajes.php lo incluyes en index y foro.

Tal como esta, te daria error en el index. Entonces la solucion seria poner include_once('funciones.php'). Otra opcion seria sacar el include de ese fichero e incluirlo en index, clientes, pedidos y foro.

Lo normal es saber de antemano que ficheros van a ser (o pueden ser) incluidos mas de una vez para una pagina, y cuales no tienen por que incluirse mas de una vez. Para los primeros usas include_once y para los segundos include.

Y como profesor, diria que uses por norma include, y en las excepciones mensionadas el include_once. Hay saber equilibrar comodidad con correccion. Podrias usar include_once para todo y olvidarte del tema. Y un profesor suspenderte, aunque no consuma mas que con include().

Todo es cuestion de diseñar bien la aplicacion, conociendo bien lo que hace las dos opciones y sabiendo lo que supone cada opcion.

No hay opcion correcta, todo depende de la situacion concreta. Solo con la experiencia aprenderas cuando usar uno u otro. Yo todavia me equivoco a veces

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 16/04/2004, 09:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Asi las cosas,
Un include es "desgastar, cansar" PHP ? (Por REDECLARAR varias veces las variables)
Un inlude_once es + ideal ?.
Justo al reves .. el include_once() hace más validaciones para que puedas programar mas "despistadamente" como comenta Josemi.

Cita:
Supongamos que eres un profesor muy extricto, que instruirias utilizar a tus alumnos?
El buen profesor explicaría que hace cada función y de ahí se deduce que NO todos los casos son iguales y por eso existen 4 funciones para hacer algo que "aparentemente" es lo mismo .. (¿no crees que si fuese así .. solo existiría include_once() ?)

Cita:
PD: phpMyAdmin-2.5.6 tiene 140 files con include() y solo 2 con include_once (en las librerias).
ahí tienes un ejemplo de lo que te he comentado .. esos "2" include_once() si estudias el código tal vez sean scripts (archivos) que son llamados de forma independiente o bajo algún otro indistintamente .. mientras que los demás archivos está ya estructurado donde deben llamarse una sóla vez ... El hecho de no usar require() tal vez sea por qué "podría" prescindir la aplicación de esos scripts o mejor tovía que ya valida la existencia de sus funciones o variables que por ahí incluyen .. asíi que deja el control del error a la aplicación y no a PHP directamente.


Cita:
function pp ($a){$a = $a*5; return $a;}
if(!function_exists('pp')){function pp ($a){$a = $a*5; return $a;}}
¿Es necesario que andes declarando una función e imediatamente valides si existe? .. Aunque esa variable la declares en un archivo externo ...

Para eso puedes usar el require() y te aseguras que tu aplicación en sí no va a pasar de ahí si falla la lectura de ese archivo ... Es un tiempo más de proceso para tu aplicación que teorícamente nunca debería fallar (error de lectura ... no de que exista el archivo o no en sí; caso que ambas funcinoes te van avisar con su mensaje de error característico).

PD: .. la validación sería tipo "si la función no existe doy un error y termino la aplicación ".. no el de intentar volver a declarar la función .. si el error que estamos hablando es que falló la lectura de un supuesto archivo externo que llamas por include() o donde corresponda ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 16/04/2004 a las 09:35
  #8 (permalink)  
Antiguo 14/06/2004, 11:01
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Blup!.

Solo fue para colocar el ejemplo de como debia utiizarse la funcion

Código PHP:
    function_exists() 
No por hacer código.

Gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:38.