Ciao 
come da titolo, ma non è seplice come sembra; in realtà il problema non è dovuto ad un nome o ad un percorso sbagliato. No è peggio 
In pratica ho creato per prova la seguente WEBDIRECTORY
ROOT --> classes
....................A
....................B
....................C
Dove appunto in root c'è una directory che contiene altre directory, chiamate A, B, C.
Ognuna di queste contiene le classi, mentre in ROOT ci sono l'index.php che richiama le varie classi a seconda dell'uso; e il file autoload.inc.php che contiene le funzioni di autoload.
Un po' di codice:
autoload.php
Codice PHP:
class Autoloader
{
public static function classLoaderA( $className )
{
$file = __DIR__ . '/classes/A/' . str_replace( '//', DIRECTORY_SEPARATOR, $className ) . '.class.php';
if ( file_exists( $file ) && is_readable( $file ) )
{
require( $file );
return;
}
else
{
throw new Exception( sprintf( '(Livello A)Ho cercato di caricare %1$s che si trova nel file %2$s', $className, $file ) );
}
}
public static function classLoaderB( $className )
{
$file = __DIR__ . '/classes/B/' . str_replace( '//', DIRECTORY_SEPARATOR, $className ) . '.class.php';
if ( file_exists( $file ) && is_readable( $file ) )
{
require( $file );
return;
}
else
{
throw new Exception( sprintf( '(Livello B)Ho cercato di caricare %1$s che si trova nel file %2$s', $className, $file ) );
}
}
public static function classLoaderC( $className )
{
$file = __DIR__ . '/classes/C/' . str_replace( '//', DIRECTORY_SEPARATOR, $className ) . '.class.php';
if ( file_exists( $file ) && is_readable( $file ) )
{
require( $file );
return;
}
else
{
throw new Exception( sprintf( '(Livello C) Ho cercato di caricare %1$s che si trova nel file %2$s', $className, $file ) );
}
}
}
spl_autoload_register( 'Autoloader::classLoaderA' );
spl_autoload_register( 'Autoloader::classLoaderB' );
spl_autoload_register( 'Autoloader::classLoaderC' );
mentre index.php
Codice PHP:
include_once( __DIR__ . '/autoload.inc.php' );
var_dump( spl_autoload_functions() );
// Carico le classi
$objA = new a( ' Sono A' );
$objAA = new aa( 'Sono AA' );
$objB = new b( 'Sono B' );
$objC = new c( 'Sono B' );
unset( $objA, $objAA, $objB, $objC );
le varie classi sono tutte uguali, variando solo la posizione all'interno delle directory e nel nome del file e della classe.
A titolo d'esempio, ecco la a.class.php
Codice PHP:
class a
{
function __construct( String $stringa )
{
echo $stringa;
}
}
in tutto 4 file chiamati a.class.php, aa.class.php, b.class.php, c.class.php che si trovano rispettivamente nelle directory A, B, C.
Ebbene, quando richiamo index.php dal browser, ottengo questo>
C:\xampp\htdocs\siti\classi\index.php:25:
array (size=3)
0 =>
array (size=2)
0 => string 'Autoloader' (length=10)
1 => string 'classLoaderA' (length=12)
1 =>
array (size=2)
0 => string 'Autoloader' (length=10)
1 => string 'classLoaderB' (length=12)
2 =>
array (size=2)
0 => string 'Autoloader' (length=10)
1 => string 'classLoaderC' (length=12)
Sono A Sono AA
( ! ) Fatal error: Uncaught Exception: (Livello A) Ho cercato di caricare b che si trova nel file C:\xampp\htdocs\siti\classi/classes/A/b.class.php in C:\xampp\htdocs\siti\classi\autoload.inc.php on line 15
( ! ) Exception: Ho cercato di caricare b che si trova nel file C:\xampp\htdocs\siti\classi/classes/A/b.class.php in C:\xampp\htdocs\siti\classi\autoload.inc.php on line 15
Call Stack
# Time Memory Function Location
1 0.0022 404800 {main}( ) ...\index.php:0
2 0.0146 416416 spl_autoload_call ( ) ...\index.php:33
3 0.0146 416416 Autoloader::classLoaderA( ) ...\index.php:33
Per chiarire subito la riga 33 di index.php è questa: $objB = new b( 'Sono B' ); mentre la 15 di autoload.inc.php è la chiamata all'eccezione di livello A.
Nella prima parte richiamo var_dump( spl_autoload_functions() ); vedere cosa fanno i tre richiami ad spl_autoload_register(); e vedo che l'array tornato contiene tutte e tre le chiamate.
E quando richiamo le classi A e AA tutto funziona perfettamente, ma quando richiamo la classe B mi va in errore.
Io non so perché fa questo, in un progetto reale che sto sviluppando in ufficio, questo non succede, ma riportando lo stesso progetto sul mio pc di casa si presente questo stesso problema.
L'esempio che ho riportato qui, è per studiare il caso, ma non comprendo cosa lo provoca. L'autoload è lo stesso!
I sistemi operativi e server sono diversi, è l'unica cosa che per ora mi spiega il problema, ma la vedo un po' tirata, anche se non impossibile.
Qui a casa Windows 10 con l'ultimo upgrade, Sistema XAMP con PHP 7.4
In ufficio Windows 7 con Apache ultima versione e PHP 7.4