Jump to content
Nerdmonkey

__autoload()

Recommended Posts

Boa tarde!

 

O que pode estar errado

function __autoload($Class) {
    $cDir=['class'];
    $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);
    endif;
}

Em ambiente local funciona, já em produção ela não encontra as classes.

Share this post


Link to post
Share on other sites

Duas coisas:

 

1. Use "/" em vez de "\\". "\\" é coisa de Windows apenas. "/" funciona pra qualquer SO

 

2. Case-sensitive. Linux é case-sensitive. MinhaClasse e minhaclasse são diferentes. Pro Windows é tudo igual

  • +1 1

Share this post


Link to post
Share on other sites

Legal Beraldo, fiz essas alterações que você sugeriu e o fluxo do script tomou outro rumo que ainda acho estar relacionado ao autoload nas não estou conseguindo identificar o problema.

 

Como ficou:


foreach($cDir as $dirName):
        if(!$iDir && file_exists(__DIR__ . "/{$dirName}/" . ucfirst($Class) . ".class.php") && !is_dir(__DIR__ . "/{$dirName}/" . ucfirst($Class) . ".class.php")):
            include_once __DIR__ . "/{$dirName}/" . ucfirst($Class) . ".class.php";
            $iDir=true;
        endif;
    endforeach;

Ele acusa erro na linha 31:

Erro na Linha: #31 :: SQLSTATE[HY000] [2002] Arquivo ou diret�rio n�o encontrado
/.../api/class/Conn.class.php

Esse é o arquivo Conn.class.php

<?php
/*
 * 
 * Conn.class [ CONEXÃO ]
 * Classe abstrata de conexão. Padrão Singleton.
 * Retorna um objeto PDO pelo método estático getConn();
 */
class Conn {
    private static $Host = HOST;
    private static $User = USER;
    private static $Pass = PASS;
    private static $Dbsa = DBSA;
    
    /** 
     * 
     * @var PDO 
     * Verifica se a variável $Connect está null.
     * Se não estiver, reutiliza a conexão já existente[Singleton]
     */
    private static $Connect=null;
    
    /**
     * 
     * @return object PDO Conecta com o banco de dados com o Pattern Singleton 
     */
    private static function Conectar(){
        try {
            if(self::$Connect==null):
                $options=[ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8' ];
                $dsn='mysql:host=' . self::$Host . ';dbname=' . self::$Dbsa;
                self::$Connect=new PDO($dsn, self::$User, self::$Pass, $options);
            endif;
        } catch (PDOException $e) {
            PHPErro($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
            die();
        }
        
        self::$Connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return self::$Connect;
    }
    
    /**
     * 
     * @return object PDO singleton Pattern
     */
    public static function getConn(){
        /**
         * 
         * @return self::Connectar
         * Executa o método estático Conectar
         * Referenciado por self:: por ser uma classe estática que não pode ser instanciada
         * e deve referir-se a si mesma utilizando a palavra reservada self::(Do inglês - si mesmo, próprio), logo ao método Conectar presente na própria classe.
         */
        return self::Conectar();
    }
}
 

Entretanto ele não deveria chamar, incluir ou fazer qualquer outra coisa se não uma conexão com o banco de dados.

 

To com uma zica com esse negócio de caminhos, diretórios, namespaces. Vide o outro post. E olha que faço os "Hello word" em todos os meus constructs, só pra garantir rs.

Share this post


Link to post
Share on other sites

Esse erro ocorre quando o MySQL está desligado ou quando o PHP não consegue se conectar a ele, geralmente por causa do path errado do socket

 

Veja esta resposta, que está bem completa:

http://stackoverflow.com/a/13771199/1233120

  • +1 1

Share this post


Link to post
Share on other sites

Tive que reabrir o tópico porque o problema ainda persiste e é na mesma linha de raciocínio. Vamos ao problema:

 

Dada a classe

<?php
namespace vendor;
 
class Autoload
{
    private $availableDir;
 
    /**
     * Expects to receive the directories where to look for classes
     * @param array $dir
     */
    public function __construct(array $dir)
    {
        $this->availableDir = $dir;
    }
 
    public function __autoload($className)
    { 
        // var_dump($className);
        echo true;
    }
}

O autload não deveria retornar o booleano?

Share this post


Link to post
Share on other sites

Não consegui evoluir nada com isso. Tem hora que acontece umas zicas dessas ai eu fico pensando: "Tudo bem, é uma área que requer atenção e muita dedicação mas, será que isso acontece com outras pessoas?" kkkkk Parece sacanagem algo que está certo mas não funciona e não retorna nenhum erro.

 

 

/**
* Autoload class
* @param $Class
*/
public function __autoload($Class)
{
$cDir=[
'controllers/db',
'controllers/includes',
'controllers/login',
'controllers/templates'
];
$iDir=null;

foreach($cDir as $dirName):
if(!$iDir && file_exists(__DIR__ . "/{$dirName}/" . ucfirst($Class) . ".php") && !is_dir(__DIR__ . "/{$dirName}/" . ucfirst($Class) . ".php")):
include_once __DIR__ . "/{$dirName}/" . ucfirst($Class) . ".php";
$iDir=true;
endif;
endforeach;
}

Share this post


Link to post
Share on other sites

1. Habilite todas as exibições de erro, como mostrado neste tópico

 

2. Troque include por require. Isso garante que o arquivo será incluído, ou um erro será disparado

 

3. Se necessário, gere logs para acompanhar o fluxo de execução

Share this post


Link to post
Share on other sites

Beleza Beraldo.

Fiz os itens um e dois por enquanto e o erro retornado foi o seguinte

 

 

Aplicação do item 2
require_once __DIR__ . "/{$dirName}/" . ucfirst($Class) . '.php';
 
Erro retornado
Fatal error: Class 'api\controllers\login\Login' not found in D:\Server\public_html\my_best\public\index.php on line 18
 
Contexto e aplicação do item 1
ini_set( 'display_errors', true );
error_reporting( E_ALL );

require_once './api/Init.php';
$init = new \api\Init;
$login = new \api\controllers\login\Login;

 

Detalhe, a classe existe lá no diretório informado.

Share this post


Link to post
Share on other sites

Olha isso, parece até coisa dos Illuminati's

require_once './_app/Autoload.php';$autoload = new Autoload;var_dump($autoload);require_once __DIR__ . '/_app/Init.php'; $init = new Init($configDatabase,$configEmail);

_app\controllers\system\SetConfigs.php<?phpnamespace _app\controller\system;abstract class SetConfigs{

_app\controller<?phpnamespace _app;class Init extends \_app\controller\system\SetConfigs{

<?phpclass Autoload{private $directory;public function __construct(){echo 'Say hello';}public function __autoload($class){echo ' world';$this->directory = ['controller/databaseChange','controller/login','controller/mailing','controller/f_system'];try{foreach($this->directory as $theDir):require_once __DIR__ . "/{$theDir}/" . ucfirst($class) . '.php';endforeach;}catch(Exception $e){var_dump($e->getMessage());}}}

Say helloFatal error: Class '_app\controller\system\SetConfigs' not found in D:\Server\public_html\A - developer\_app\Init.php on line 5

Acho que os Rockefeller estão manipulando meus códigos :v

 

Blz conseguir corrigir um problema.

require_once './_app/Autoload.php';require_once './_app/Init.php'; $autoload = new Autoload;$init = new \_app\Init($configDatabase,$configEmail);

Isso resolveu o problema para encontrar a classe Init.

Agora onde estou sempre batendo, é nesse bendito autoload

Share this post


Link to post
Share on other sites

Quanto mais mecho, mais novos problemas aparecem kkk... Isso é bom porque estou aprendendo a lidar com eles

 

Essa é minha index, é o ponto de partida, é de onde tudo irá começar e o que definirá todas as funções da minha aplicação. Até aqui, o que ela deveria fazer é simples: - Iniciar a sessão e os erros do PHP; - Setar os header, cache, data zone e fluxo do documento; - Instanciar o autoload; - Instanciar o Init que é o coração da aplicação; - Prover a página solicita pela URL;

 

 

<?php
session_start();

ini_set('display_errors',1);
ini_set('display_startup_erros',1);
error_reporting(E_ALL);

header("Cache-Control: must-revalidate");
header( "Expires: " . gmdate("D, d M Y H:i:s", time() + 60 * 60 * 24 * 3) . " GMT" );
header( 'Content-Type: text/html; charset=utf-8' );
setlocale( LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese' );
date_default_timezone_set( 'America/Sao_Paulo' );
ob_start();

$no_inc=filter_input(INPUT_GET,'no_inc',FILTER_DEFAULT);
$sep=explode('/',filter_input(INPUT_GET,'url',FILTER_DEFAULT));
$getSearch=filter_input(INPUT_GET,'p',FILTER_DEFAULT);

require_once './_app/Autoload.php';
require_once './_app/Init.php';
require_once './_app/controller/system/IncludePage.php';

require_once './_app/controller/databaseChange/Conn.php';
require_once './_app/controller/databaseChange/Read.php';

$configDatabase = [
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'myhost',
'server' => filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_DEFAULT)
];

$configEmail = [
'hostmail' => 'mail.mail.com.br',
'usermail' => 'contato@mail.com.br',
'passmail' => '123456',
'from' => 'contato@mail.com.br',
'fromname' => 'Mail | Mail'
];

$autoload = new Autoload;
$init = new \_app\Init($configDatabase,$configEmail);
$page = new IncludePage($sep[0],$no_inc);
$page->includeFile();

 

Esse é o meu header.php que, tem sua marcação HTML5 default e entre elas possui a marcação

 

 

<meta property="og:url" content="<?= $init->getUrl(); ?>">

 

Onde nesse escopo, eu não consigo recuperar o valor do objeto $init, que já foi instanciado em index.php no código acima. Como vocês verão nesse trecho...

 

 

require_once './_app/controller/databaseChange/Conn.php';
require_once './_app/controller/databaseChange/Read.php';

 

continuo incluindo manualmente as classes porque ainda estou trabalhando nesse autoload abençoado. Acredito que está tudo entrelaçado. Vou continuar tentando, se alguém vir algo que eu não tenha relatado, por favor, poste ai =)

Share this post


Link to post
Share on other sites

O que pode estar errado, não consigo de jeito nenhum achar o erro nesse código, que coisa!

 

Index.php

<?php
require_once 'Autoload.php';
$classFake = new Fake();
var_dump($classFake);

Autoload.php

<?php
class Autoload
{
public function __autoload($class)
{
try
{
require_once __DIR__ . ucfirst($class) . '.php';
}
catch(Exception $e)
{
var_dump($e->getMessage());
}
}
}

Fake.php

<?php
class Fake
{
public function __construct()
{
echo 'Say hello';
}
}

Erro

 

Fatal error: Class 'Fake' not found in

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.