Ir para conteúdo

POWERED BY:

Arquivado

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

gremio10

Erro em __autoload

Recommended Posts

Fala galera, estava vendo umas video aulas de PHP OO e o cara estava usando patterns, o singleton e factory.

 

e estava utilizando como nome das classes como o Zend usa, sempre separando com _ o que for referente a pastas.

 

ex.:

 

Lib
 Connection
    Db.php

class Lib_Connection_Db {}

 

 

minha loader.php

 

function __autoload( $_className )
   {
       $_className = str_replace( "_", "/", $_className ) . ".php";
       require_once $_className;
   }

 

e na minha index eu setei

 

set_include_path( "Lib/" . PATH_SEPARATOR . "Lib/Connection/" . PATH_SEPARATOR . "config/" . PATH_SEPARATOR . get_include_path() 
);

require_once "loader.php";

 

só que quando vou testar uma classe, ele diz que não encontra ela, Fatal error: Class 'Lib_Connection_Db' not found

 

o que estou fazendo de errado ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

inclua essa linha antes do loader

echo get_include_path(); exit;

require_once "loader.php";

 

 

apenas para debug..

 

veja o que retorna.. verifique se os caminhos estão mesmo corretos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim, o nome do projeto é Livraria...

 

e a organização de pastas é assim

 

- config
  - index.php
  - loader.php
  - config.php
  - smarty.php
- lib
  - Livraria
    - Db
      - Abstract.php
      - Connection.php
      - Adapter
        - Interface.php
        - Mysql.php
  + Smarty
- teste.php

 

no meu arquivo teste.php, eu mando ele chamar a classe Connection na função factory, static.

 

require_once "config/index.php";
Livraria_Db_Connection::factory( $_config );

 

mas ai ele me retorna : Class 'Livraria_Db_Connection' not found

 

o autoload deveria ter trocado os _ para / que ficaria Livraria/Db/Connection.php

 

inclua essa linha antes do loader

echo get_include_path(); exit;
require_once "loader.php";

 

ele me retornou

 

lib/;lib/Livraria/;config/;.;\xampp\php\PEAR

 

acredito que esteja correto.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao sei dizer ao certo, pois pode ser varios motivos.

 

olhando por cima, aconselho a usar paths absolutos ao invés de paths relativos

 

por exemplo

 

lib/

lib/Livraria/

config/

 

é melhor especificar o caminho completo

 

exemplo em ambiente unix:

 

/var/www/wesites/site.bar/lib/

/var/www/wesites/site.bar/lib/Livraria/

/var/www/wesites/site.bar/config/

 

 

exemplo para windows

 

c:\www\wesites\site.bar\lib\

c:\var/www\wesites\site.bar\lib\Livraria\

c:\var/www\wesites\site.bar\config\

 

 

veja:

http://forum.imasters.com.br/topic/439535-como-saber-a-raiz-do-projeto/page__view__findpost__p__1735955

http://forum.imasters.com.br/topic/376027-caminhos-relativos-include-require/page__p__1453384__hl__dirname__fromsearch__1#entry1453384

http://forum.imasters.com.br/topic/386034-cronjob-erro-ao-enviar-email/page__p__1501143__hl__dirname__fromsearch__1#entry1501143

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uso ambiente Windows para testes:

 

C:\xampp\htdocs\Livraria\lib\;C:\xampp\htdocs\Livraria\lib\Livraria\;C:\xampp\htdocs\Livraria\config\;.;C:\xampp\php\PEAR
Fatal error: Class 'Livraria_Db_Connection' not found in C:\xampp\htdocs\Livraria\teste.php on line 5

 

teste.php

 

<?php

   require_once "config/index.php";

   printr( Livraria_Db_Connection::factory( $_config ) ); /* line 5 */

   $smarty->display( "teste.html" );

 

index.php

 

<?php

   error_reporting( E_ALL | E_STRICT );
   ini_set( "display_errors", "on" );

   define( "DEFAULT_PATH", dirname( __DIR__ ) );

   set_include_path( DEFAULT_PATH . "\lib\\" . PATH_SEPARATOR . DEFAULT_PATH . "\lib\Livraria\\" . PATH_SEPARATOR . DEFAULT_PATH . "\config\\" . PATH_SEPARATOR . get_include_path() );

/***
*  set_include_path( "lib/" . PATH_SEPARATOR . "lib/Livraria/" . PATH_SEPARATOR . "config/" . PATH_SEPARATOR . get_include_path() );
*/
   session_start();

   function printr( $_params )
   {
       echo "<pre>";
       print_r( $_params );
       echo "</pre>";
   }

   echo get_include_path();

   require_once "loader.php";
   require_once "config.php";
   require_once "smarty.php";

 

loader.php

 

<?php

   function __autoload( $_className )
   {
       $_className = str_replace( "_", "/", $_className ) . ".php";
       require_once $_className;
   }

 

nunca tinha mexido com isso antes, mas é possivel um autoload dar erro assim ?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você fizer

Lib
 Connection
    Db.php

<?php class Connection_Db{...} ?> #e não <?php class Lib_Connection_Db{...} ?>

set_include_path(get_include_path() . PATH_SEPARATOR . "Lib");

function __autoload( $_className )
   {
       $_className = str_replace( "_", "/", $_className ) . ".php";
       require_once $_className;
   }

new Connection_Db();

acredito que funcione.

 

Testei!

 

-teste/
   index.php
   -library/
       -Db/
           Connection.php
       -config/
           autoload.php

<?php
class Db_Connection {

static function getConnection(){
	return 'Está conectado';
}

}
?>

<?php function __autoload( $_className )
   {
       $_className = str_replace( "_", "/", $_className ) . ".php";
       require_once $_className;
   }
?>

#index.php
<?php
require_once 'library/config/autoload.php';
ini_set('include_path', get_include_path() .  PATH_SEPARATOR . 'library');

echo Db_Connection::getConnection();

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom...

 

eu fiz assim:

 

- Livraria
  - config
     - index.php
     - loader.php
     - config.php
     - smarty.php
  - lib
     - Livraria
       - Db
         - Abstract.php
         - Connection.php
           - Adapter
             - Interface.php
             - Mysql.php
     + Smarty
  - teste.php

/**
* Index.php
*/

<?php

   error_reporting( E_ALL | E_STRICT );
   ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . 'lib');    

   session_start();

   function printr( $_params )
   {
       echo "<pre>";
       print_r( $_params );
       echo "</pre>";
   }

   require_once "loader.php";
   require_once "config.php";
   require_once "smarty.php";

 

minha classe Livraria_Db_Connection

 

<?php

class Livraria_Db_Connection
{
   public static function factory( $_config )
   {
       switch( $_config[ "adapter" ] )
       {
           case "mysql" : return Livraria_Db_Adapter_Mysql::getConnection( $_config ); break;
       }
   }
}

 

fiz dois testes agora, dando um require_once na minha teste.php, deu : Fatal error: Class 'Livraria_Db_Connection' not found in C:\xampp\htdocs\Livraria\teste.php on line 5, agora,

dando um require_once no loader.php, deu : Warning: require_once(Livraria/Db/Connection.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

Fatal error: require_once() [function.require]: Failed opening required 'Livraria/Db/Connection.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

 

e quando coloquei o que você falou:

 

set_include_path(get_include_path() . PATH_SEPARATOR . "Lib");

 

deu

 

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111

Fatal error: Class 'Livraria_Db_Connection' not found in C:\xampp\htdocs\Livraria\teste.php on line 5

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz dois testes agora, dando um require_once na minha teste.php, deu : Fatal error: Class 'Livraria_Db_Connection' not found in C:\xampp\htdocs\Livraria\teste.php on line 5, agora,

dando um require_once no loader.php, deu : Warning: require_once(Livraria/Db/Connection.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

Fatal error: require_once() [function.require]: Failed opening required 'Livraria/Db/Connection.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

e quando coloquei o que você falou:

 

set_include_path(get_include_path() . PATH_SEPARATOR . "Lib");

 

Qual o código em teste.php?

Eu escrevi "Lib", mas você usa "lib". Corrija para ver se muda alguma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

teste.php

 

<?php

   require_once "config/index.php";

   printr( Livraria_Db_Connection::factory( $_config ) );

 

eu testei mudando tanto o nome da pasta quanto a do código, deu o mesmo erro de

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111

Fatal error: Class 'Livraria_Db_Connection' not found in C:\xampp\htdocs\Livraria\teste.php on line 5

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa incluir no path a partir da raiz do seu projeto.


/**
* Index.php
*/

<?php

   error_reporting( E_ALL | E_STRICT );
   ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . (dirname(__FILE__)));    

   session_start();

   function printr( $_params )
   {
       echo "<pre>";
       print_r( $_params );
       echo "</pre>";
   }

   require_once "loader.php";
   require_once "config.php";
   require_once "smarty.php";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

o mais estranho é que no video que estou vendo, não retornou um erro parecido, o que me deixou pra baixo, por que não consigo resolver esse erro, por que será que aparece como deprecated no config do php ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando assim:

 

define( "DEFAULT_PATH", dirname( __DIR__ ) );

   set_include_path( DEFAULT_PATH . "\lib" . PATH_SEPARATOR . DEFAULT_PATH . "\Livraria" . PATH_SEPARATOR . DEFAULT_PATH . "\config" . PATH_SEPARATOR . get_include_path() );

printr( explode( ";", get_include_path() ) );exit;

 

retornou :

 

Array
(
   [0] => C:\xampp\htdocs\Livraria\lib
   [1] => C:\xampp\htdocs\Livraria\Livraria
   [2] => C:\xampp\htdocs\Livraria\config
   [3] => .
   [4] => C:\xampp\php\PEAR
)

 

agora, com o dirname( __FILE__ );

 

define( "DEFAULT_PATH", dirname( __FILE__ ) );

   set_include_path( DEFAULT_PATH . "\lib" . PATH_SEPARATOR . DEFAULT_PATH . "\Livraria" . PATH_SEPARATOR . DEFAULT_PATH . "\config" . PATH_SEPARATOR . get_include_path() );

printr( explode( ";", get_include_path() ) );exit;

 

retorna:

 

Array
(
   [0] => C:\xampp\htdocs\Livraria\config\lib
   [1] => C:\xampp\htdocs\Livraria\config\Livraria
   [2] => C:\xampp\htdocs\Livraria\config\config
   [3] => .
   [4] => C:\xampp\php\PEAR
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu quiz dizer que antes estava dando errado porque você não estava incluindo no path o caminho absoluto até a pasta lib do seu projeto.

 <?php error_reporting( E_ALL | E_STRICT );
   ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . 'lib'); ?> 

E que por isso as classes não eram encontradas. Então sugeri que você incluisse o caminho absoluto usando dirname(__FILE__).

  <?php error_reporting( E_ALL | E_STRICT );
   ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . dirname(dirname(__FILE__)));?>    

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não vai acreditar, mas eu descobri o erro...

 

era o require_once "smarty.php";

 

mas por que ?

 

<?php

   require_once "Smarty/libs/Smarty.class.php";

   $smarty = new Smarty();
   $smarty->template_dir = "templates";
   $smarty->compile_dir = "templates_c";
   $smarty->cache_dir = "cache";
   $smarty->config_dir = "configs";

 

ao meu ver, está tudo correto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não vai acreditar, mas eu descobri o erro...

 

era o require_once "smarty.php";

 

mas por que ?

 

<?php

   require_once "Smarty/libs/Smarty.class.php";

   $smarty = new Smarty();
   $smarty->template_dir = "templates";
   $smarty->compile_dir = "templates_c";
   $smarty->cache_dir = "cache";
   $smarty->config_dir = "configs";

 

ao meu ver, está tudo correto...

 

Este pode ser outro erro. O principal que interrompe o autoload é a pasta lib não ser incluida no path corretamente.

#Livraria/config/index.php
<?php ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . dirname(dirname(__FILE__))); ?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que quando eu utilizo o

 

ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . dirname(dirname(__FILE__)));

 

ele dá o seguinte erro:

 

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111

Warning: require_once(Livraria/Db/Connection.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\Livraria\config\loader.php on line 6

Fatal error: require_once() [function.require]: Failed opening required 'Livraria/Db/Connection.php' (include_path='.;C:\xampp\php\PEAR;C:\xampp\htdocs\Livraria') in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

mas se eu tiro e coloco :

 

set_include_path( "lib/" . PATH_SEPARATOR . "Livraria/" . PATH_SEPARATOR . "config/" . PATH_SEPARATOR . get_include_path() );

 

ele funciona, com o smarty comentado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

você ativou E_STRICT em config/index.php. Por iss você recebe estas mensagens.

"Deprecated: Assigning the return value of new by reference is deprecated in xxx" aparece quando você usa, por exemplo, $objeto = & new UmaClasse().

A última mensagem diz que uma classe não foi encontrada.

Altere o include_path para

 <?php ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . dirname(dirname(__FILE__)) . 'lib'); ?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

index.php

 

<?php

   //error_reporting( E_ALL | E_STRICT );
   ini_set( 'include_path' , get_include_path() .  PATH_SEPARATOR . dirname(dirname(__FILE__)) . 'lib');
   //set_include_path( "lib/" . PATH_SEPARATOR . "Livraria/" . PATH_SEPARATOR . "config/" . PATH_SEPARATOR . get_include_path() );

   session_start();

   function printr( $_params )
   {
       echo "<pre>";
       print_r( $_params );
       echo "</pre>";
   }

   require_once "smarty.php";
   require_once "loader.php";
   require_once "config.php";

 

Smarty.php

 

<?php

   require_once "lib/Smarty/libs/Smarty.class.php";

   $smarty = new Smarty();
   $smarty->template_dir = "templates";
   $smarty->compile_dir = "templates_c";
   $smarty->cache_dir = "cache";
   $smarty->config_dir = "configs";

 

assim, no index... retorna:

 

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111

 

comentando o require_once "smarty.php"; retorna:

 

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 80

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config.php on line 166

Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\Config\Container.php on line 111

Warning: require_once(Livraria/Db/Connection.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\Livraria\config\loader.php on line 6

Fatal error: require_once() [function.require]: Failed opening required 'Livraria/Db/Connection.php' (include_path='.;C:\xampp\php\PEAR;C:\xampp\htdocs\Livrarialib') in C:\xampp\htdocs\Livraria\config\loader.php on line 6

 

=/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, para a função __autoload, funcionar corretamente, faça assim

 

define('CONTROLLERES', realpath(dirname(dirname(__FILE__))).'/controllers/');

 

set_include_path(implode(PATH_SEPARATOR, array(
   CONTROLLERES.'classes',
   get_include_path()
)));

 

 

function __autoload($class_name) {
   require_once $class_name . '.php';
}

 

o diretório

classes

vai dentro da controllers.

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.