[spip-dev] Re[2]: [Spip] Pb de "Cannot redeclare"

il n'est pas normal de charger plusieurs fois un même fichier,
c'est le signe d'un code non adapté ou qui a mal évolué.

inc-A a besoin de inc-C. inc-B a besoin de inc-C. Chacun l'incluent
donc de leur côté. Si X a besoin à la fois de inc-A et inc-B, il est
normal qu'il inclue les deux

Les inclusions en cascade sont un gouffre sans fond qui empêche de
"rentrer" rapidement dans le code. Un fichier "inc-*" ne devrait dans
l'idéal jamais faire d'include.

Bon, maintenant, je sais bien que ce n'est pas toujours possible, que
ce n'est qu'un idéal vers lequel il faut tendre.

Le code utilisé (if defined() return; suivi de define()) est le même
que celui utilisé dans n'importe quel projet C, C++ ou équivalent.

Sauf que dans un projet C, le code en question est déjà compilé, donc
on ne pense même plus aux implications mémoire du bouzin, non ?

Ici, on charge un fichier "inc-*" qui peut être de taille conséquente,
pour finalement ne pas s'en servir.

Bon, OK, finalement il nous faut une fonction include_once ... :slight_smile:

if (!function_exists('include_once')) {
  function include_once($filename)
  {
    if (!isset($GLOBALS['_included_files'])) {
      $GLOBALS['_included_files'] = array();
    }
    if (!isset($GLOBALS['_included_files'][$filename])) {
      $GLOBALS['_included_files'][$filename] = true;
      include $filename;
    }
  }
}

Tu peux toujours aller dire aux codeurs de la libc que le code n'est
pas adapté ou n'a pas su évoluer... :)))

Je m'en garderais bien ... :wink:

-Nicolas

Nicolas Hoizey wrote:

Ici, on charge un fichier "inc-*" qui peut être de taille conséquente,
pour finalement ne pas s'en servir.

Bon, OK, finalement il nous faut une fonction include_once ... :slight_smile:

if (!function_exists('include_once')) {
  function include_once($filename)
  {
    if (!isset($GLOBALS['_included_files'])) {
      $GLOBALS['_included_files'] = array();
    }
    if (!isset($GLOBALS['_included_files'][$filename])) {
      $GLOBALS['_included_files'][$filename] = true;
      include $filename;
    }
  }
}

Heu... est-ce que les variables "globales" éventuellement définies
dans $filename ne seront pas vues comme locales à include_once ?
Idem dans l'autre sens : si $filename utilise des variables globales,
il va falloir ajouter à chaque fois la notation $GLOBALS['...'] ?
(ou alors déclarer global $var; mais ça risque de faire des warnings)

a+

Bon, OK, finalement il nous faut une fonction include_once ... :slight_smile:

if (!function_exists('include_once')) {
  function include_once($filename)
  {
    [...]
  }
}

Heu... est-ce que les variables "globales" éventuellement définies
dans $filename ne seront pas vues comme locales à include_once ?

"Bonne réponse de l'Amiral" (c) P. Bouvard

Eh oui, je me suis encore fourvoyé, à force de vouloir répondre trop
vite ... :frowning:

Bon bin une autre solution serait :

inc-toto.php