Ir para conteúdo

POWERED BY:

Arquivado

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

ro.fonseca

[Resolvido] __autoload nao funciona!

Recommended Posts

Então, a minha função __autoload simplesmente nao funciona quando eu faço o require de qualquer classe antes dela, segue abaixo um exemplo o codigo:

 

NÃO funciona

 

require("classes/teste.php");
function __autoload($file){
...
}

$app = new Teste;

 

 

FUNCIONA

function __autoload($file){
...
}

$app = new Teste;

 

 

Alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nunca testei, mas ao que parece o autoload está tendo peso maior do que teu require.

 

Experimenta trocá-lo por require_once(), dessa forma, seja qual for a formacom que você invoca o arquivo dentro do autoload, se este arquivo já tiver sido incluído, ele não o será de novo.

 

Claro, isso é apenas especulação, afinal, você não postou lá muitas informações, como por exemplo, o começo da sua classe Teste (ou outra real) e a sua implementação de __autoload().

Compartilhar este post


Link para o post
Compartilhar em outros sites

o autoload eh ra carregar a classe automaticamente, por isso o nome de auto load, carga automatica, se você faz um require antes dele, você esta anulando seu efeito, sua funcao...você precisa definir as regras de carregamento do autoload no autoload...lembrando e ele sera chamado pra toda e qq classe, logo defina bem suas regras de carregamento...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nunca testei, mas ao que parece o autoload está tendo peso maior do que teu require.

 

Experimenta trocá-lo por require_once(), dessa forma, seja qual for a formacom que você invoca o arquivo dentro do autoload, se este arquivo já tiver sido incluído, ele não o será de novo.

 

Claro, isso é apenas especulação, afinal, você não postou lá muitas informações, como por exemplo, o começo da sua classe Teste (ou outra real) e a sua implementação de __autoload().

 

Já testei colocando o require_once antes do autoload e nada...

 

o autoload eh ra carregar a classe automaticamente, por isso o nome de auto load, carga automatica, se você faz um require antes dele, você esta anulando seu efeito, sua funcao...você precisa definir as regras de carregamento do autoload no autoload...lembrando e ele sera chamado pra toda e qq classe, logo defina bem suas regras de carregamento...

Eu já tentei fazer sem o require_once, mas o que acontecia é que ele chamava o Sytem pelo autoload, só que dentro da classe System, ele faz uma outra chamada de objeto, e esse objeto chamado dentro da classe system não eh carregado pelo autolad.

 

exemplo:

FUNCIONA(repare que está sem o require da classe system)

function __autoload($file){

...
{
$teste = new System

NÃO FUNCIONA(repare que o autoload nao carrega o nome da classe do obj instaciado dentro da Classe System)

function __autoload($file){

...
{
$teste = new System
$teste->run();

 

Class System{
public function run(){
  $testeChamada = new TesteChamada;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi o que o nosso amigo disse. O __autoload faz a requisição da classe logo quando o documento se inicia. A regra definida para o autoload é essa, carregar algo logo quando o documento iniciar. Você está cometendo um erro de lógica no seu script.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi o que o nosso amigo disse. O __autoload faz a requisição da classe logo quando o documento se inicia. A regra definida para o autoload é essa, carregar algo logo quando o documento iniciar. Você está cometendo um erro de lógica no seu script.

 

Mas quando o documento é iniciado o metodo run é chamado, instanciando logo depois o obj, qual seria o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A keyword 'class' não deve ser com letra maiúscula, o nome da classe deve ser idêntico ao nome do arquivo

 

function __autoload ( $className ) { 
       require_Once sprintf ( '%s.php' , $className ) ; 
} 

 

Utilize também o includePath para setar o diretório em que suas classes estão ..

 

set_include_path ( get_include_path() . PATH_SEPARATOR . 'classes' ) ; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

exatamente, toda vez q uma classe for instanciada o autoload eh evocado, vamos ver um exemplo

 

//este exemplo vai chamar todas as classes dentro do diretorio classes
function __autoload($class)
{
require_once("classes/{$class}.php");
}
//ou com o padrao zend
//este exemplo vai trocar todos os nomes, exceto oultimo, pelo seu diretorio, e o nome de fato da classe sera o nome do arquivo
//ex. System_core => System/core.php
//ex. View_Input => View/Input.php
function __autoload($class)
{
require_once(str_replace('_','/',"{$class}.php"));
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu dei um echo em "$className" dentro de autoload e ele só exibe "system".

 

Isso, esse é o nome interceptado pelo autoLoad, agora você tem que incluir esse arquivo, ele não vai 'fazer' o include pra você .. por isso te disse pra usar o includePath, assim, quando você for incluir X arquivo, o autoLoad vai varrer esses diretórios em busca do arquivo system.php ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi esse teu exemplo, mas sim, tecnicamente toda vez q uma classe for instanciada é evocada o autoload, mas comigo, no meu exemplo, instanciando os objetos dentro da classe System, o autoload não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso, esse é o nome interceptado pelo autoLoad, agora você tem que incluir esse arquivo, ele não vai 'fazer' o include pra você .. por isso te disse pra usar o includePath, assim, quando você for incluir X arquivo, o autoLoad vai varrer esses diretórios em busca do arquivo system.php ..

Eu sei como funciona o autoload po, o problema aqui é que ele só está chamando o system, e os objs que eu instanciei dentro dele, cade? É isso o q refiro.

 

ok, posta o codigo todo...

 

alias, mostra a arvore das classes...

 

Já postei po, é simples, tá num outro topico um pouco acima, é só uma classe que dentro dela tem um metodo q instancia um outro objeto logo que o documento é chamado, documento este, que tem a função autoload.

Compartilhar este post


Link para o post
Compartilhar em outros sites

escrever o nome da funcao nao eh codigo todo...pra você ser ajudado tem q postar o codigo pra vermos onde você esta errando...nao eh possivel q o pesoal d zend iria deixar mais de 59% dos sites mundiais com esse bug...

Compartilhar este post


Link para o post
Compartilhar em outros sites

escrever o nome da funcao nao eh codigo todo...pra você ser ajudado tem q postar o codigo pra vermos onde você esta errando...nao eh possivel q o pesoal d zend iria deixar mais de 59% dos sites mundiais com esse bug...

KKKKKK pois é, é pq nao to em casa, então só mostrei o q de fato tava acontecendo, passei a madrugada de hj nesse bug q eu ainda nao sei o q é, mas ele funciona na logica do meu exemplo mostrado anteriormente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho uma idéia do que possa ser, mas preciso que você poste:

 

- Sua implementação do __autoload()

 

- O começo do arquivo da classe System, isto é, desde o <?php até o fecho de chaves do construtor

 

- O mesmo acima mas da classe TesteChamada.

 

- Sua estrutura de diretórios, porém apenas os relativos aos dois arquivos supra mencionados.

 

Mesmo que já tenha postado algumas dessas coisas, peço que as repita num único post para facilitar o apontamento de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pronto! Podem até reparar q dei um echo no $file, para ver o que sai, como tem o "require_once" chamando já a classe system, ele não chama ela de novo no autoload, mas como eu falei antes, se caso eu tirar esse require_once, ele chama a tal "system", só que, cade de chamar pelo nome os objetos instanciados pela tal classe?

 

Classe System:

<?php
class System{
   private $_url;
   private $_explode = array();
   public  $_controller;
   public  $_action;
   public  $_param = array();


   public function __construct(){
$this->setUrl();
$this->setExplode();
$this->setController();
$this->setAction();
$this->setParams();
   }

   private function setUrl(){
$_GET['url'] = (isset($_GET['url']) && $_GET['url'] != 'index' ? $_GET['url'] : "index/indexAction");
$this->_url = $_GET['url'];
   }

   private function setExplode(){
$this->_explode = explode('/', $this->_url);
   }

   private function setController(){
$this->_controller = $this->_explode[0];
   }

   private function setAction(){
$action = (!isset($this->_explode[1]) || empty($this->_explode[1]) || $this->_explode[1] == "index" ? "indexAction" : $this->_explode[1]);
$this->_action = $action;
   }

   private function setParams(){
for($i=1;$i<count($this->_explode);$i++)
    if($i % 2 == 0)
	$this->_param[$this->_explode[$i]] =  (!empty($this->_explode[$i+1]) ? $this->_explode[$i+1] : "");
   }

   public function getUrl(){
return $this->_url;
   }

   public function getParams($param = null){
if(empty($param))
    return $this->_param;
else
    return $this->_param[$param];
   }

   public function run(){
$controller_patch = CONTROLLERS.$this->_controller.'Controller.php';
if(!file_exists($controller_patch))
    die('Erro, Controlador inexistente');
require_once($controller_patch);
$app = new $this->_controller;
if(!method_exists($app, $this->_action))
    die('Metodo Inexistente');
$action = $this->_action;
$app->$action();
   }


}
?>

 

O index.php

 

<?php
require_once("system/system.php");
require_once("system/controller.php");
require_once("system/model.php");
DEFINE('CONTROLLERS', 'app/controllers/');
DEFINE('VIEWS', 'app/views/');
DEFINE('MODELS', 'app/models/');
DEFINE('HELPERS', 'system/helpers/');
DEFINE('SYSTEM', 'system/system.php');

function __autoload_files($file){
   echo $file;
   if(file_exists(MODELS . $file . 'Model.php'))
require_once(MODELS . $file . 'Model.php');
   if(file_exists(VIEWS . $file . '/' . $file . '.phtml'))
require_once(VIEWS . $file . '/' . $file . '.phtml');
//    if(file_exists(HELPERS . $file . '.php'))
//	require_once(HELPERS . $file . '.php');
   else
die ("Classe inexistente"); 

}
spl_autoload_register('__autoload_files');

$start = new System;
$start->run();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você diz nesse método ?

   public function run(){
       $controller_patch = CONTROLLERS.$this->_controller.'Controller.php';
       if(!file_exists($controller_patch))
           die('Erro, Controlador inexistente');
       require_once($controller_patch);
       $app = new $this->_controller;
       if(!method_exists($app, $this->_action))
           die('Metodo Inexistente');
       $action = $this->_action;
       $app->$action();
   }

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.