Mam sobie dwa pliki ( napisałem na podstawie niedawnej dyskuj na forum na temat dołanczania plików ):
<?php
/**
* Funkcja ładująca automatycznie pliki klas potrzebne do działania skryptu
*
* @version 1.0.0
* @package Spot
* @copyright Copyright: 2004 Lublin, Łęczna
* @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail>
*
* $Id$
*/
function __autoload( $strClassName )
{
if( ! $arrConfig )
{
$objAutoload = Autoload::GetInstance( 'lib' );
}
{
require_once( $arrConfig[ $strClassName ] );
}
else
{
echo '<br /><b>Fatal error</b>: Class '<b
>' . $strClassName . '</b
>' not found.<br />'; }
}
?>
<?php
/**
* Klasa tworząca mapę plików z klasami
*
* @version 1.0.0
* @package Spot
* @copyright Copyright: 2004 Lublin, Łęczna
* @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail>
*
* $Id$
*/
class Autoload
{
private $arrClassesMap = array(); private $strDirName = '';
private $strClassesMapFile = 'ClassesMap.php';
public function __construct( $strDirName )
{
$this->strDirName = $strDirName;
if( ! file_exists( $this->strDirName . '/' . $this->strClassesMapFile ) ) {
$this->GetClassesMap();
$this->CreateClassesMapFile();
}
}
private function GetClassesMap()
{
$objRecursiveDirectory = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $this->strDirName ), true );
foreach( $objRecursiveDirectory as $objFile )
{
if( ! is_file( $objFile->getPathname() ) ) {
continue;
}
$blnIsClass = false;
foreach ($arrTokenAll as $intToken)
{
{
list( $intTokenID, $strTokenValue ) = $intToken;
switch($intTokenID)
{
case T_CLASS:
$blnIsClass = true;
break;
case T_INTERFACE:
$blnIsClass = true;
break;
case T_STRING:
if ($blnIsClass)
{
$this->arrClassesMap[ $strTokenValue ] = $objFile->getPathname();
$blnIsClass = false;
}
break;
case T_WHITESPACE:
break;
default:
$blnIsClass = false;
break;
}
}
}
}
}
private function CreateClassesMapFile()
{
$strHeader = '<?php' . \"nn\";
$strBody = '';
foreach( $this->arrClassesMap as $strKey => $strValue )
{
$strBody .= $strKey . ' = ' . './' . $strValue;
$strBody .= \"n\";
}
$strFooter = \"n\" . '?>';
file_put_contents( $this->strDirName . '/' . $this->strClassesMapFile, $strHeader . $strBody . $strFooter );
}
public function GetClassesFile()
{
return './' . $this->strDirName . '/' . $this->strClassesMapFile;
}
static public function GetInstance( $strDirName )
{
static $objInstance;
if( !isset( $objInstance ) )
{
$objInstance = new Autoload( $strDirName );
}
return( $objInstance );
}
}
?>
Po krótce to działa tak:
1. Klasa Autoload tworzy plik z mapą klas.
2. Funkcja __autoload() działa na podstawe pliku utworzonego przez klasę Autoload.
A teraz w czym problem.Jeżeli plik jest to działa wyśmienicie, jeżeli go nie ma to działanie klasy wiesza Apache'a. Oto logi:
Cytat
May 11 19:07:50 ( ... ) kernel: pid 10817 (httpd), uid 80: exited on signal 11
May 11 19:07:53 ( ... ) kernel: pid 10818 (httpd), uid 80: exited on signal 11
May 11 19:07:55 ( ... ) kernel: pid 10819 (httpd), uid 80: exited on signal 11
May 11 19:07:57 ( ... ) kernel: pid 10820 (httpd), uid 80: exited on signal 11
May 11 19:08:00 ( ... ) kernel: pid 10821 (httpd), uid 80: exited on signal 11
Uwaga
!Problem
nie występuje na Windzie. Ale za to wystepuje na FreeBSD 5.4 z Apache 2.0.54 i php 5.0.4.
Po wnikliwej analizie błądów doszedłem do tego że odpowiedzialna jest za to linia
33 w klasie Autoload ( czyli wiersz z iteratorami ).
Jakieś pomysły
Ten post edytował mike_mech 11.05.2005, 18:35:18