2010-01-21 10 views
6

Tenía la esperanza de que si tuviera que definir constantes en un espacio de nombres separado, como:Constantes de autocarga en PHP?

namespace config\database\mysql; 

const HOST = 'localhost'; 
const USER = 'testusr'; 
const PASSWORD = 'testpwd'; 
const NAME = 'testdb'; 

que iba a ser capaz de utilizar __autoload a ellos incluyen automáticamente:

function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\HOST; 

Esto, sin embargo, No funciona. No se llama al __autoload para la constante como lo está con las clases, dejándome con un error Undefined constant.

¿Alguna manera de que pueda simular la clase __autoload para las constantes?

Respuesta

7

probar este (trabajó en mi servidor):

<?php 
namespace config\database\mysql; 

class Mysql 
{ 
    const HOST = 'localhost'; 
    const USER = 'testusr'; 
    const PASSWORD = 'testpwd'; 
    const NAME = 'testdb'; 
} 
?> 

<?php 
function __autoload($className) 
{ 
    echo "Autoload: {$className}\n"; 
    $class_file = str_replace('\\', '/', $className) . ".php"; 
    if(file_exists($class_file)) { 
     include $class_file; 
    } 
} 

echo config\database\mysql\Mysql::HOST; 
?> 

Básicamente es necesario crear una clase para actuar como un contenedor para las constantes, pero al hacerlo se permite __autoload() para funcionar como se pretende.

+0

¡Gracias! Esto parece prometedor. Aunque no me gusta tener que envolverlos en clases simuladas, parece que funciona. – Atli

0

El uso de una constante indefinida arrojará una advertencia de PHP.

Puede escribir un controlador de error personalizado para detectar la advertencia y cargar el archivo de constantes apropiado.

+1

Eso no es lo que Atli está pidiendo ... –

+0

Gracias por la sugerencia. Desafortunadamente, el error 'Undefiend constant' es un error fatal (' E_ERROR'), que un controlador personalizado no puede detectar. – Atli

+0

Hmm. Claro que solía ser un aviso, pero no estoy usando 5.3. – Mike