gremio10 14 Denunciar post Postado Agosto 19, 2011 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
hinom 5 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
hinom 5 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 Experimenta com dirname(__FILE__). Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 É 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
vieira.rrafael 2 Denunciar post Postado Agosto 19, 2011 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
gremio10 14 Denunciar post Postado Agosto 19, 2011 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
Williams Duarte 431 Denunciar post Postado Agosto 19, 2011 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