2010-09-13 18 views
11

Hola Tengo una clase muy simple que implementa una interfaz. Tanto la clase como la interfaz están en el mismo archivo.Problema de la interfaz PHP - clase no encontrada

Cuando implemento la interfaz me sale un error fatal "Clase no encontrada", pero cuando elimino los implementos y trato de utilizar la clase, ¿puedo usarla bien?

¿Alguien puede ofrecer algún consejo al respecto?

Lo sentimos Aquí hay un código que estoy usando para probar en la actualidad

$tester = new TypeOneTester(); 
$tester->test("Hello"); 

interface iTestInterface 
{ 
    public function test($data); 
} 

class TypeOneTester implements iTestInterface 
{ 
    public function test($data) 
    { 
     return $data; 
    } 
} 
+2

Cualquier código para reproducir un error? – Crozin

+0

Lo siento, he publicado algunos ahora – David

+1

Trate de poner la definición de clase/interfaz al comienzo del archivo (antes de usarlo). –

Respuesta

10

crear una instancia de la clase después de la clase y la interfaz se definen, no antes.

El orden de definición en este caso debe ser:

  1. interfaz
  2. Clase
  3. instancia de la clase (objetos)
+1

¿Por qué fallaría eso solo al usar interfaces? es decir, cuando se usan clases normales y clases abstractas, este problema no está presente – David

+1

Si bien esta es la solución (y se corrigió el mismo problema que yo), ¿se trata de un comportamiento definido o simplemente un error en PHP? – Brad

3

huele a un fallo en PHP. Asegúrate de que sea reproducible con la última versión y publícala en bugs.php.net.

código Reproducir

interface I {} 

$a = new A; 
$b = new B; 

class A { 
    function __construct() { echo 'A'; } 
} 

class B implements I { 
    function __construct() { echo 'B'; } 
} 

esperado

AB 

real:

A 
Fatal error: Class 'B' not found... 
2

Eso se debe a que, interfaz de php de carga, y una instancia de objeto de clase de la clase clase donde hay un cierto orden y debe estar en un archivo Php, si el archivo no está de acuerdo con un pedido de 1. Require_one interf as, 2. Clase Require_one

5

Ésta es una limitación (muy mal) documentado:

http://php.net/manual/pl/migration5.incompatible.php

En algunos casos, las clases deben ser declaradas antes de su uso. Solo ocurre si se utilizan algunas de las nuevas funciones de PHP 5 (como las interfaces). De lo contrario, el comportamiento es el viejo.

No obstante, he presentado un informe de error. OMI debe ser corregido ya que es un comportamiento incoherente y el mensaje de error no es útil para cualquiera que asuma que yo lo hice. Simplemente no me importa dónde declaras las funciones/clases. Vamos, que ha estado ahí por más de 10 años ...

https://bugs.php.net/bug.php?id=69665

Cuestiones relacionadas