2010-09-13 23 views
11

Ciao Ho una classe molto semplice che implementa un'interfaccia. Sia la classe che l'interfaccia si trovano nello stesso file.Problema di interfaccia PHP - classe non trovata

Quando implemento l'interfaccia ottengo un errore fatale "Classe non trovata", ma quando rimuovo gli strumenti e poi provo a usare la classe posso usarlo bene ???

Qualcuno può offrire qualche consiglio su questo?

spiacenti qui è un codice che sto usando per testare in questo momento:

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

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

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

Qualsiasi codice per riprodurre un errore? – Crozin

+0

Siamo spiacenti, ho postato qualche ora – David

+1

Prova a mettere definizione di classe/interfaccia all'inizio del file (prima di utilizzarlo). –

risposta

10

creare un'istanza della classe dopo la classe e l'interfaccia sono definiti, non prima.

L'ordine di definizione in questo caso dovrebbe essere:

  1. interfaccia
  2. Classe
  3. un'istanza della classe (oggetti)
+1

Perché questo fallirebbe solo quando si usano le interfacce? cioè quando si utilizzano le classi normali e classi astratte allora questo problema non è presente – David

+1

Mentre questa è la soluzione (e fissa lo stesso problema che avevo), è questo comportamento definito o semplicemente un errore in PHP? – Brad

3

odori come un insetto in php. Assicurati che sia riproducibile con l'ultima versione e pubblica su bugs.php.net.

codice Riprodurre

interface I {} 

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

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

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

Previsto

AB 

attuale:

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

Questo è dovuto al fatto, l'interfaccia php carico, e creare un'istanza oggetto classe classe dove c'è un certo ordine e deve essere in un file Php, se il file non è conforme a un ordine di 1. Require_one interf ace, 2. classe Require_one

5

Ciò è una limitazione (molto poco) documentato:

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

In alcune classi casi deve essere dichiarato prima dell'uso. Succede solo se vengono utilizzate alcune delle nuove funzionalità di PHP 5 (come le interfacce). Altrimenti il ​​comportamento è vecchio.

Tuttavia, ho presentato una segnalazione di errore. IMO dovrebbe essere risolto in quanto è un comportamento incoerente e il messaggio di errore non è utile per chi assume come ho fatto quel PHP semplicemente non importava dove si dichiarano funzioni/classi. Dai, è stato lì per oltre 10 anni ...

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