2010-01-11 23 views

Respuesta

20

El mecanismo de carga automática funciona exactamente de la misma manera con las clases estáticas que lo hace con uno no estático:

  • La función de carga automática/método que será llamado registrado
  • que va a recibir el nombre de la clase
  • Y que tendrá que requerir/incluye el código PHP necesario


en realidad, el cargador automático no lo hace incluso tiene que "saber" si se llama para cargar una clase estática o dinámica, ya que su función es cargar el código PHP que contiene la definición de la clase, y no crear una instancia ni nada.

6

Sí, activaría __autoload.

No es solo 'nuevo' el que activa la carga automática, cualquier referencia a una clase desconocida lo hará. Incluso algo así como usar class_exists activará el autocargador (este no es siempre el comportamiento deseable, por lo que class_exists tiene un segundo parámetro para deshabilitar la carga automática)

5

Seguramente la mejor y más rápida es intentarlo?

De los documentos no se necesita nada que mencione new.

+1

+1 por mencionar un método muy preciso para cosas como esta: simplemente pruébalo y mira lo que sucede :-) –

+0

¡Jajaja, gracias! –

0

Tuve un problema con esto, donde un error de sintaxis muy leve daba un mensaje de error bastante claro donde parecía que __autoload() no se estaba llamando.

SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass" 

SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass" 

PHP interpreta extrañamente el sencillo ":" (en lugar de la doble correcta "::") como nada. Trata callStaticMethod() como una llamada a método global, lo que significa que omite la __autoload.

+0

Sé que esto es viejo, pero quiero dar una idea de lo que está pasando aquí. Creo que va a interpretar 'SomeClass' como una referencia a una variable global que no existe, y': 'como el inicio de un bloque de código. Como si fueras a 'foreach(): '. – Anther

+0

En realidad, ':' es el símbolo de la etiqueta PHP si se usa de esa manera. Entonces, 'SomeClass: callStaticMethod() 'se interpretará como una función global llamada' callStaticMethod' justo después de una etiqueta llamada 'SomeClass'. Las etiquetas se usan para la palabra clave 'goto' de PHP :) http://us2.php.net/goto –

0

Tuve exactamente la misma pregunta que el cartel original después de la carga automática de clases llamando a sus métodos estáticos no funcionó. Estaba usando Php 5.3.5 y se me ocurrió la siguiente solución.

function autoload($class_name) { 
    $directories = array(
     'php/classes/', 
     'php/vendor/' 
    ); 
    foreach ($directories as $directory) { 
     if (file_exists($directory . $class_name . '.php')) { 
      require_once($directory . $class_name . '.php'); 
      return; 
     }  
    } 
} 
spl_autoload_register('autoload'); 

Nota: la función spl_autoload_register se ha utilizado en lugar de __autoload que parece haber sido la solución.

0

El objetivo de un autocargador es cargar un class siempre que sea necesario. Entonces, si su código de cliente necesita una clase porque quiere acceder a un miembro de la clase estática, y aún no se ha cargado, boom, lo carga y lo pone en juego.

Lógicamente, lo primero que debería funcionar son las llamadas a miembros estáticos. El uso de un constructor para crear instancias de un objeto generalmente ocurre después de que se haya cargado una clase.Por lo tanto, el caso estático debe ser lo primero en su corazón (pero hay demasiados libros y de tal manera que subutilice los miembros de la clase estática). :-)

Cuestiones relacionadas