2011-02-14 13 views
9

Ho una classe in php denominata "SEO_URL". In un punto in quella classe ho questoclasse php non trovata quando è inclusa

$class_name = "cPath_SEO_URL"; 
return $class_name::href(); 

e ottengo

Fatal error: Class 'cPath_SEO_URL' not found in 
...\includes\classes\seo.class.php on line 52 

Il fatto è che ho incluso la classe in cima SEO_URL

include_once(/path/to/my/class); 
class SEO_URL{ 

} 

e ottengo questo errore .

Tuttavia, quando indico la classe sopra alla classe SEO_URL, funziona. Quindi questo funziona.

class cPath_SEO_URL{ 
    function cPath_SEO_URL(){} 
    function href() { return "CPathHref"; } 
} 
class SEO_URL{ 
... 
     $class_name = "cPath_SEO_URL"; 
     return $class_name::href(); 
... 
} 

e questo non

include_once(/path/to/my/class); 
class SEO_URL{ 
... 
     $class_name = "cPath_SEO_URL"; 
     return $class_name::href(); 
... 
} 

sto provando questo in osCommerce.

Perché è quello?

+0

Hai avvisi PHP disattivati? PHP genererà un'eccezione E_WARNING quando non è in grado di trovare il file di classe, di solito verrà trasmesso al browser ma potrebbe essere disabilitato. – JamesHalsall

+2

Senza offesa, ma la mia ipotesi del 90% è che il file di classe non è corretto. Dovresti usare require_once invece di include_once in modo che un errore durante la lettura (come nome file errato/diritti di accesso insufficienti) causi un errore php fatale invece di un semplice avvertimento. – phihag

+0

+1 per @phihag per aver detto che dovresti usare 'require_once' piuttosto che' include_once' dove il tuo programma non può vivere senza il file incluso. Questo ti darà errori utili quando il bisogno fallisce piuttosto che strani errori quando cerchi di utilizzare le funzioni correlate. – Spudley

risposta

24

Ok, non credere a quello che era il problema.

sono abituato ad aprire e chiudere il file php come questo

<? 
    ... 
?> 

non

<?php 

?> 

e il file di classe era senza il cartellino <?php .. ?> ma il cartellino <? ... ?>. Immagino che l'ambiente in cui lavoro ora abbia voluto solo lo <?php non lo <?.

Carica la classe ma non la interpreterà come php.

+3

Ottimo consiglio, grazie mille! – Wiseman

+1

A volte si modifica l'ambiente di hosting e questo comportamento inizia. È la configurazione php 'short_open_tag'. –

+0

Mi hai salvato la vita, grazie! –

1

Con

$class_name = "cPath_SEO_URL"; 
$test = new $class_name(); 
return $test::href(); 

si effettua una chiamata statica su un'istanza. Non ha senso.
Invece si vorrà fare

$class_name = "cPath_SEO_URL"; 
return $class_name::href(); 
+0

sì, è qualcosa che vedrò dopo, il fatto è che non riesco a trovare la classe quando è inclusa. Tuttavia, quando indico la classe nello stesso file, è ok. Hai idea del motivo per cui non troverà la classe quando è inclusa? – billaraw