Jump to content

spl_autoload_register


amando96
 Share

Recommended Posts

Boas, tenho estado a trabalhar numa CMS, mas acho que preciso de repensar como guardo as classes...

Tenho um só ficheiro e uma só classe que trata de tudo, utilizadores, galeria, posts, catálogo, menu dinâmico, base de dados,  mensagens pessoais, TUDO.

Ora, isto passa das 1000 linhas sem qualquer espaço entre linha, e ainda falta muito para o acabar, tirando possíveis addons que poderei querer meter no futuro, ainda por cima nem sempre uso as funções todas, por exemplo se vou ver posts não preciso de tocar no catálogo...

Já estive a ler sobre o autload de classes, mas não consegui meter a funcionar.

Tenho um ficheiro chamado main.class.php que é incluido em todas as páginas.

Esse ficheiro era suposto chamar as outras classes, cada uma no seu ficheiro, todas na mesma pasta, acabam todas com .class.php, tenho isto:

main.class.php:

        namespace cms;

class main {
       
        }

spl_autoload_extensions('.class.php');
spl_autoload_register();
new post();

 

post.class.php:

        namespace cms;

class post extends main{

        }

Erro: Fatal error: Class 'cms\post' not found

Têm todas o mesmo namespace, não percebo...

Agradeço umas luzes, cumprimentos  👍

Link to comment
Share on other sites

Qual é a versão do PHP que estás a usar?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Verifica se a pasta aonde isso está está no include_path.

http://www.php.net/manual/en/function.get-include-path.php

http://www.php.net/manual/en/function.set-include-path.php

@yoda.

Eu tb n gosto de namespaces. Nem sei qual a sua real utilidade. Tem alguma coisa a ver com os packages do java?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Na verdade, nunca usei namespaces...

Estive a experimentar e gostei porque o meu IDE (netbeans) apresenta um autocomplete muito útil como se pode ver na imagem.

Outra "vantagem" é organizar as classes em packages, como o java faz...

http://img834.imageshack.us/img834/5306/phpnamespacesnetbeans.jpg

Para windows, basta usar o spl_autoloader_register(). No linux, o autoloader tenta usar as mesmas barras de caminho e falha. Tive que criar a minha função para fazer autolload:

index.php

<?php
error_reporting(E_ALL | E_NOTICE);
ini_set('display_errors', 1);

use cms;

// Linux ou Windows
function __autoload($classname) {
    try {
        require_once str_replace('\\', DIRECTORY_SEPARATOR, $classname) . '.php';
    }
    catch (Exception $e) {
        echo "Class not found...";
    }
}

$app = new \cms\app();
Link to comment
Share on other sites

Cheguei a tentar com o __autoload() e deu... mas dizem isto no php.net:

Tip

spl_autoload_register() provides a more flexible alternative for autoloading classes. For this reason, using __autoload() is discouraged and may be deprecated or removed in the future.

E fiquei na dúvida entre usar ou não.

Já agora, tenho um objecto que no construct tem que ir buscar informação a uma base de dados.

     class main{
          var $setting;
          var $dbconn;
          function __contruct(){
               $this->getSettings();
               $this->dbconn = new bd('localhost', 'root', 'password');
          }

          function getSettings(){
               $this->setting = mysql_fetch_array($this->dbconn->sql_query("SELECT * FROM settings"));
          }
     }

Porque não dá assim? instanciar outro objecto dentro de um objecto.

Se fizer

$this->setting = mysql_fetch_array(db::sql_query("SELECT * FROM settings"));

Diz-me que estou a usar $this fora do contexto de objecto porque tenho de declarar o método sql_query como estático... essa mesma função usar o $this varias vezes.

Isto de OOP  :wallbash: tenho que arranjar um livro, entretanto parece que vou voltar a ter os métodos todos na mesma classe...

Link to comment
Share on other sites

class db extends main{
	function connect(){
		$this->link = @mysql_connect($this->dbHost,$this->dbUsername,$this->dbPassword);
		if(!$this->link){
			print "<b>Couldn't connect ".mysql_error()."</b>";
		} elseif(!mysql_select_db($this->dbDatabase,$this->link)){
			print "<b>DB not found ".mysql_error()."</b>";
		}
		return true;
	}


	function sql_query($query){
		$this->connect();
		$this->query = $query;

		if($this->result = mysql_query($this->query)){
			$this->disconnect();
			return $this->result;
		} else {
			$this->disconnect();
		}        
	}

	function disconnect(){
		return mysql_close($this->link);
	}
}

A única razão de não estar a usar PDO é porque o servidor para onde isto vai não o tem... está na mesa arranjar outra coisa.

Link to comment
Share on other sites

Acho que não faz sentido a classe db estender a classe main; suponho que a classe main seja uma class tipo sistema... o sistema pode nem usar base de dados...

Partindo das duas classes que tens, devem funcionar assim:

class db {

                private $dbHost;
                private $dbUsername;
                private $dbPassword;
                private $link;
                
                public function __construct($host, $user, $pass) {
                    $this->dbHost = $host;
                    $this->dbUsername = $user;
                    $this->dbPassword = $pass;
                }

                public function connect($database){
                        $this->link = @mysql_connect($this->dbHost,$this->dbUsername,$this->dbPassword);
                        if(!$this->link){
                                print "<b>Couldn't connect ".mysql_error()."</b>";
                        } elseif(!mysql_select_db($database,$this->link)){
                                print "<b>DB not found ".mysql_error()."</b>";
                        }
                        return true;
                }
                ...
        }

class main {

          public $setting;
          public $dbconn;

          function __contruct(){
               $this->dbconn = new bd('localhost', 'root', 'password');
               $this->getSettings();
          }

          function getSettings(){
               $this->dbconn->connect('basededados');
               $this->setting = mysql_fetch_array($this->dbconn->sql_query("SELECT * FROM settings"));
          }
}
Link to comment
Share on other sites

@yoda.

Eu tb n gosto de namespaces. Nem sei qual a sua real utilidade. Tem alguma coisa a ver com os packages do java?

Namespaces é mais uma forma de organização das classes. O modelo HMVC cobre isso sem grandes problemas, visto que a complexidade de uma aplicação web nunca é demasiado extensa para tal.

Mais um exemplo da classe db :

class db {

# configuration
private $config = array(
	'host' => 'localhost',
	'username' => 'root',
	'password' => false,
	'name' => 'test'
);

# database connection pointer
private $pointer;

public function __construct(array $config = null) {

	if ($config)
	{
		array_merge($this->config, $config);
	}

	return true;
}

public function connect()
{
	$this->pointer = mysql_connect($this->config['host'], $this->config['username'], $this->config['password']) or die(mysql_error());

	mysql_select_db($this->config['name'], $this->pointer) or die(mysql_error());

	return true;
}
}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.