terça-feira, 12 de maio de 2015

Função __autoload do PHP não abre subpastas no Linux.

Olá, esses dias me deparei com um problema com a função autoload do php, estava desenvolvendo meu TCC, um sistema para gestão de igrejas.

Até então estava tudo funcionado normalmente em meu localhost, mais minha dor de cabeça começou quando fui fazer o deploy para o servidor web na Digital Ocen, logo após o upload dos arquivos fui fazer os teste no sistema, e para meu desespero nada funcionou, tentei de tudo: instalei o PDO, habilitei ele no php.ini e nada funcionou. Segue abaixo o script do autoload que eu estava usando.

<?php
function __autoload($Class) {
    $cDir = ['Conn'];
    $iDir = null;
    foreach ($cDir as $dirName):
        if (!$iDir && file_exists(__DIR__ . "\\{$dirName}\\{$Class}.class.php") && !is_dir(__DIR__ . "\\{$dirName}\\{$Class}.class.php")):
            include_once (__DIR__ . "\\{$dirName}\\{$Class}.class.php");
            $iDir = true;
        endif;
    endforeach;
    if (!$iDir):
        trigger_error("Não foi possível incluir {$Class}.class.php", E_USER_ERROR);
        die;
    endif;
}
?>

Essa solução funciona normalmente no ambiente windows, mais no ambiente linux é um desastre por causa da separação de diretório do linux que é diferente da encontrada no windows. A solução para isso é uma constante que o php tem que trata esse tipo de incompatibilidade.
A constante DIRECTORY_SEPARATOR resolve esse tipo de incompatibilidade com o uso de barras para a separação de diretórios no linux. Segue abaixo a solução do do código a cima.

<?php
function __autoload($Class) {
    $cDir = ['Conn'];
    $iDir = null;
foreach ($cDir as $dirName):
    if (!$iDir && file_exists($file = __DIR__ . DIRECTORY_SEPARATOR . $dirName . DIRECTORY_SEPARATOR . $Class . '.class.php') && !is_dir($file)):
        include_once ($file);
        $iDir = true;
    endif;
endforeach;
 if (!$iDir):
        trigger_error("Não foi possível incluir {$Class}.class.php", E_USER_ERROR);
        die;
    endif;
}
?>

Com essa simples constante do php evitamos essa incompatibilidade entre sistemas.
Abraço e até a próxima dica.


0 comentários :

Postar um comentário