2010-09-20 5 views
0

Si j'ai une classe qui comprend un fichier avec une constante comme ceci:Comment encapsuler un fichier include?

define("FOO", "bar"); 

Y at-il un moyen de faire la classe comprennent le fichier avec encapsulation donc si j'utilise la part de la classe qui a déjà une FOO constante défini, il ne va pas rompre?

+0

Que se passe-t-il si la constante est déjà définie? Si le nom de la constante est vraiment générique, le fait qu'il soit défini ne garantit pas qu'il s'agit d'une autre version de la même classe ... – Piskvor

+1

si vous êtes au stade de votre application où vous ne savez pas ce qui est défini et ce qui est pas alors vous devriez repenser votre architecture IMO – RobertPitt

Répondre

1

Créer une classe statique et utiliser des constantes serait la meilleure façon de résumer les constantes spécifiques:

static class Constants 
{ 
    const Name = 'foo'; 
    const Path = 'Bar'; 
} 

Et puis utiliser comme si :

echo Constants::Name; //foo 
echo Constants::Path; //bar 

en ce qui concerne le précheck que vous pouvez faire

function _defined($key,$check_classes = false) 
{ 
    if($check_classes) 
    { 
     foreach(get_declared_classes() as $class) 
     { 
      if(constant($class . '::' . $key) !== null) 
      { 
       return true; 
      } 
     } 
    } 
    if(!defined($key)) //global Scope 
    { 
     return true; 
    } 
} 

Utilisation:

class a 
{ 
    const bar = 'foo'; 
} 

if(_defined('bar',true)) //This would be true because its within a 
{ 
    //Blah 
} 

Si votre pensée d'une situation comme si

class a 
{ 
    const b = '?'; 
} 
class b 
{ 
    const b = '?'; 
} 

les constantes sont dans le cadre de la classe afin qu'ils aient aucun effet sur l'autre !

0

Vous pouvez utiliser une Contant classe

class Foo 
{ 
    constant FOO = 'bar' 
} 

Cependant, vous devez inclure la classe avant de pouvoir utiliser la constante avec Foo::FOO. Une alternative avec des constantes régulières est d'utiliser pour les préfixer avec un préfixe fournisseur pour rendre les conflits moins probables, par ex.

define('JOHN_FOO', 'bar') 

ou utiliser les espaces de noms nouvellement introduites (PHP 5.3)

define('JohnIsaacks\FOO', 'bar'); 

Mais dans tous les cas, je me demande pourquoi vous auriez besoin que. Si vous voulez charger des classes, ajoutez simplement un autoloader.

+1

ou simplement 'require_once' – RobertPitt

+0

@Robert Bien sûr, mais cela ne serait pas aider avec contant clashing, juste avec des classes du même nom. – Gordon

0

Vous pouvez vérifier si elle est déjà définie constante à l'aide defined:

<?php 
define("FOO", "1"); 
if (!defined("FOO")) { ## check if constant is not defined yet 
    define("FOO", "2"); 
} 
echo FOO; 
?> 
Questions connexes