Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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;
}

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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 =)

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.