2017-06-28 2 views
0

J'ai un vieux projet en utilisant une classe autoload personnalisée pour parler avec une base de données MySQL et PHPExcel:Intégrer PHP Spout dans mon projet

function __autoload($class_name) 
{ 
    if (stripos($class_name, 'controller') !== false) { 
     require_once(System::getPath('CONTROLLERS') . $class_name . '.class.php'); 
    } else if (stripos($class_name, 'PHPExcel') !== false) { 
     $path = System::getPath('EXTERNAL') . str_replace('_', '/', $class_name) . '.php'; 
     if (is_readable($path)) { 
      require_once $path; 
     } 
    } else { 
     if (stripos($class_name, 'abstract') === false) { 
      $class_name = str_ireplace('mapper', '', $class_name); 
     } 
     require_once(System::getPath('MODELS') . $class_name . '.class.php'); 
    } 
} 

Maintenant, je veux migrer mon projet de PHPExcel à bec verseur (https://github.com/box/spout/) depuis PHPExcel est trop lent quand il doit écrire de gros fichiers (30000+ cellules avec des styles personnalisés). Si j'utilise la manière suggérée d'intégrer dans mon projet Spout en ajoutant

require_once System::getPath('EXTERNAL') . '/Spout/Autoloader/autoload.php'; 

à mon dossier, PHP ne peut plus trouver mes classes (celle chargée de) autoload. Est-il possible de réussir à intégrer Spout dans mon projet en gardant ma fonction __autoload personnalisée?

Répondre

0

La fonction __autoload est une fonction globale qui est remplacée lorsque vous utilisez l'autochargeur de bec. Pour utiliser les deux fonctions de chargement automatique, vous devez passer à spl_autoload_register. Cela vous permettra de définir plusieurs gestionnaires pour charger vos classes (PHP les parcourra jusqu'à ce que l'on puisse charger la classe avec succès).

Donc, dans votre cas, il suffit de remplacer function __autoload($class_name) par spl_autoload_register(function ($class_name) et cela devrait fonctionner!