Ir para conteúdo

Arquivado

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

Eduardo Giullyanny

[Resolvido] __autoload chato

Recommended Posts

então, mas qdo eu lanço o que o Carlos colocou, ele funciona...

 

Não seria por dependências ao código dele ? mostre seu código completo, além do loader, mostre onde você inicia, onde você faz a instância ...

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos tentar ordenar as idéias...

 

include_path contém uma lista de paths onde as funções require, include, fopen(), file(), readfile() e file_get_contents() buscarão os arquivos.

 

Autoload é automaticamente chamada no caso de você tentar usar uma classe/interface que ainda não foi definida

 

Como um autoload implica num require/include sabemos que quaisquer modificações no include_path deve ser feita ANTES da definição da função de autoload.

 

Pergunta: Você lembrou dessa consideração?

 

Você não pode combinar múltiplos métodos de autoload através da função __autoload. Para suprir essa necessidade é que temos spl_autoload_register()

 

Porém, se já houver uma declaração de __autoload(), este método deve ser invocado, tantas vezes quantas necessárias, dentro da função:

 

function __autoload( $class ) {

   spl_autoload_register(

       function() use( $class ) {

           // Do something with $class
       }
   );
}

Particularmente eu não gosto dessa abordagem, mas deve ser questionado se este é o seu caso.

 

Há também a limitação da versão, em que as Closures usadas como no exemplo acima só estão disponíveis a partir do PHP 5.3.

 

Por fim, minha contribuição com um autoload simples, sem a função __autoload, inclusive com suporte à NameSpaces.

 

Estarei assumindo que todas as bibliotecas estão num diretório common FORA da raiz da aplicação (um nível acima), o que proporciona reutilização de uma mesma biblioteca (como um framework) em múltiplos projetos sem duplicação dos arquivos ao mesmo tempo que facilita o processo de indexamento das IDE's.

 

set_include_path(

   '.'
   . PATH_SEPARATOR . realpath( '../common' ) . DIRECTORY_SEPARATOR

   . PATH_SEPARATOR . get_include_path()
);

spl_autoload_register(

   function( $classname ) {

       $classname = stream_resolve_include_path(

           str_replace( '\\', DIRECTORY_SEPARATOR, $classname ) . '.php'
       );

       if( $classname !== FALSE ) {

           include $classname;
       }
   }
);

Estou usando stream_resolve_include_path() por ser mais eficiente que file_exists() para o propósito.

 

Considerando a seguinte estrutura de diretorios:

 

/
/common
/common/MyLibrary
/common/MyLibrary/SayHello.php
/project
/project/index.php

Temos os seguintes arquivos (em seus respectivos paths):

 

/common/MyLibrary/Foo.php

<?php

namespace MyLibrary;

class SayHello {

   public function __construct( $name ) {

       printf( 'Hello, %s!', $name );
   }
}

/project/index.php

 

<?php

set_include_path(

   '.'
   . PATH_SEPARATOR . realpath( '../common' ) . DIRECTORY_SEPARATOR

   . PATH_SEPARATOR . get_include_path()
);

spl_autoload_register(

   function( $classname ) {

       $classname = stream_resolve_include_path(

           str_replace( '\\', DIRECTORY_SEPARATOR, $classname ) . '.php'
       );

       if( $classname !== FALSE ) {

           include $classname;
       }
   }
);

new MyLibrary\SayHello( 'Bruno' );

A saída, como esperado:

 

Hello, Bruno!

Exemplos para PHP 5.3. Para versões anteriores devem ser feitas algumas adaptações.

 

Espero que ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vocês estão me ensinando muita coisa... Bom, sei q estou prolongando o post, mas...

 

Percebi meu erro ali, fiz uns teste e encontrei este autoload aqui, que esta funcionando.:

<?php
final class Autoloader
{
   public static function start()
   {
       spl_autoload_register(function ( $class )
	    {
	        require_once( sprintf( '%s.php', str_replace( '_', DIRECTORY_SEPARATOR, $class ) ) );
	    } 
	);
   }
}

 

chamando ele estaticamente igual o Andrey Knupp disse, mas me deparei com dois resultados do objeto assim.:

//usando o codigo passado por Carlos...

object(PDO)#5 (0) { }

 

//usando esta acima...

object(PDO)#4 (0) { }

lembrado q isso estou debugando com var_dump, pq me retorna #4 e #5 valores diferentes, li o codigo do carlos vi sobre funções q num conhecia e num entendi pq aparece valores diferentes se estou chamando a mesma coisa.

 

Não estou chamando junto, fiz os teste separados e sempre retornam isso

 

tem gente pedindo para ver meu path.:

set_include_path('lib/' . PATH_SEPARATOR . 'lib/Projeto/' . PATH_SEPARATOR . 'config/' . PATH_SEPARATOR . get_include_path());

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza eu agradeço a todos q me deram uma mão, desculpe por prologar tanto o post, é que eu queria realmente entender este metodo do autoload com esta função(spl_autoload_register), para depois eu não ficar enchendo vocês com perguntas tolas e sem sentido. Acho q sozinho não estava entendendo.

 

Obrigado galera, acho que por enquanto da pra tocar sozinha, mas "EU VOLTAREI!!!! HAHAHAHAHAHAHAHAHAHAHA..."

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é nada, é do debug, se tá retornando PDO, e for o esperado tá certo.

PS. @Bruno Augusto ... seu autoloader não se aplica para a nomenclatura de classes que ele pretende utilizar.

Eu até cheguei a escrever a adaptação, mas ia ficar maior que o necessário então suprimi-a, substituindo pela última linha.

 

Sem explicar nem nada, seria assim:

 

/common/MyLibrary/Foo.php

<?php

class MyLibrary_SayHello {

   public function __construct( $name ) {

       printf( 'Hello, %s!', $name );
   }
}

/project/index.php

<?php

set_include_path(

   '.'
   . PATH_SEPARATOR . realpath( '../common' ) . DIRECTORY_SEPARATOR

   . PATH_SEPARATOR . get_include_path()
);

spl_autoload_register(

   function( $classname ) {

       $classname = stream_resolve_include_path(

           str_replace( '_', DIRECTORY_SEPARATOR, $classname ) . '.php'
       );

       if( $classname !== FALSE ) {

           include $classname;
       }
   }
);

new MyLibrary_SayHello( 'Bruno' );

Pouca coisa mudou. Mas traduzir isso em frases explicativas ia ser um horror. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Bruno.

Não gosto mesmo de ressuscitar defuntos mas como só hoje, em 2015, estou precisando trabalhar com o spl_autoload, me explica só uma parte do seu código se for possível:

 

 

. PATH_SEPARATOR . realpath( 'api/controllers/db' ) . DIRECTORY_SEPARATOR

 

A que se refere o realpath? Estou tentando aprender e entender de uma vez por todas o spl. Acredito que esse trecho explicará tudo que falta pra eu entendê-la por completo =]

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.