Jump to content

Multiple Singleton!!


gatituh
 Share

Recommended Posts

Boas,

Ando a iniciar-me nos design patterns em php e estou com problemas em conseguir fazer um multiple singleton  :wallbash:

Já procurei muito pela net e não se encontra quase nada acerca de Multiple Singleton ou então estou a procurar mal...  😕

mas o meu problema passa por conseguir fazer uma ligação ao mysql que tem varias base de dados...

alguém me pode dar umas dicas ou algum sitio com documentação para ir ver...  🙂

Obrigado

Link to comment
Share on other sites

Um de nós os dois está equivocado...  ?

Só pode existir uma instância de uma classe singleton; não existem múltiplas instâncias de uma classe singleton, isso é uma classe normalíssima...

O teu problema de se trabalhar com várias bases de dados é simples de resolver, mas se tens a classe de encapsulamento do MySQL criada como singleton, então... ardeu.

Podes dar mais detalhes sobre o teu problema em concreto, o que é que já fizeste e como?

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Já procurei muito pela net e não se encontra quase nada acerca de Multiple Singleton ou então estou a procurar mal...  😕

Talvez porque isso seja muito correcto, ou é Singleton, ou não é, não pode ser Singleton e ao mesmo tempo ter múltiplas instâncias.

O teu problema de se trabalhar com várias bases de dados é simples de resolver, mas se tens a classe de encapsulamento do MySQL criada como singleton, então... ardeu.

Ardeu? Porquê? É trivial ter um Singleton que permita ligação a várias bases de dados distintas, até a vários servidores distintos, é tudo uma questão de guardar os dados na estrutura correcta, sendo estrutura a palavra chave.

Link to comment
Share on other sites

Ardeu? Porquê? É trivial ter um Singleton que permita ligação a várias bases de dados distintas, até a vários servidores distintos, é tudo uma questão de guardar os dados na estrutura correcta, sendo estrutura a palavra chave.

Se a classe encapsular um acesso à BD, não consegues ter várias BD's abertas ao mesmo tempo, porque não podes ter várias instâncias da classe, certo?

Se a classe for de uso tipo:

$classeBD = new ClasseBD(); // singleton, vai devolver-te uma instância pré-existente, a menos que não haja
$classeBD->setBD("a_minha_bd");
$classeBD->query($sql);

Ardeu. Não podes ter duas ao mesmo tempo e, consequentemente, duas BD's abertas ao mesmo tempo (não impedindo, como é lógico, que se mude de BD sempre que necessário). No entanto, se a classe for de uso tipo:

$classeBD = new ClasseBD();
$classeBD->setBD("bd1", "a_minha_bd");
$classeBD->query("bd1", $sql);

Já dá, mas não existe vantagem nenhuma em usar-se um singleton assim; mais valia ter uma classe normalíssima que encapsulasse directamente a BD, com várias instâncias concorrentes.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Já consegui  😁

deixo aqui o codigo de singleton o truque é passar um var e por num array 🙂 pelo menos foi como fiz  😕

de qualquer forma deixo aqui o codigo... digam se pode ser feita alguma melhoria

<?php
class ligabd {

    var $dbConnectionID;
    var $queryID;
    var $record;
    var $host;
    public $datab;
    public $user;
    public $password;

    private function connect() {
        $this->dbConnectionID = @mysql_connect($this->host, $this->user, $this->password);
        if (!$this->dbConnectionID) {
            echo(mysql_errno() . ":" . mysql_error());
            exit;
        } else {
            $status = @mysql_select_db($this->datab, $this->dbConnectionID);
            if (!$status) {
                echo(mysql_errno() . ":" . mysql_error());
                exit;
            }
        }
    }

    private static $instances = array();

    private function __contruct($name){
       echo $this->datab =$name;
    }

    public static function getInstance($name){
        if(!isset(self::$instances[$name])){
            self::$instances[$name] =new ligabd($name);
        }
        return self::$instances[$name];
    }

    public function ligabd($name) {
        $this->host = "localhost";
        $this->datab = $name;
        $this->user = "root";
        $this->password = "pass";
        $this->connect();
    }

    //  public methods

    public function query($sql) {
        // connect to db incase connection id is not set
        if (empty($this->dbConnectionID))
            $this->connect();
        $this->queryID = @mysql_query($sql, $this->dbConnectionID);

        // handle error
        if (!$this->queryID) {
            echo("<br><font color=red>" . mysql_errno() . ":" . mysql_error() . "</font> -><b>QUERY:</b>" . $sql);
            exit;
        }
    }

    public function nextRecord() {
        $this->record = @mysql_fetch_array($this->queryID);
        $status = is_array($this->record);
        return($status);
    }

    public function numRows() {
        $rows = @mysql_num_rows($this->queryID);
        return($rows);
    }

    public function lastID() {
        $Lastid = @mysql_insert_id();
        return($Lastid);
    }

    public function getField($field) {
        return($this->record[$field]);
    }

}

?>

Link to comment
Share on other sites

Já dá, mas não existe vantagem nenhuma em usar-se um singleton assim; mais valia ter uma classe normalíssima que encapsulasse directamente a BD, com várias instâncias concorrentes.

As vantagens do Singleton não estarão em encapsular acessos à BD, nesse caso até seria de perguntar porque usar um Singleton para guardar o acesso à BD, tenha várias ou apenas uma instância, não há vantagens nenhuma em usar o padrão para isso. Mas a questão não foi a utilidade o vantagem do padrão, foi simplesmente a possibilidade de ter um Singleton com a gestão de acesso a várias BDs.

gatituh, isso não é um Singleton, não é a implementação do padrão Singleton. Quanto a melhorar, esse código permite várias BDs se o username tiver acesso a todas elas, o que é uma limitação, mas voltamos ao mais básico: porquê pegar num padrão Singleton, de aplicação específica, e tentar martelar para teres esse tipo de gestão? Não ganhas nada com o suposto "Singleton" e parece-me que só complica.

Link to comment
Share on other sites

Isso que tens é quase uma pool em que tem limitas-te uma "slot" por tipo de ligação.

Porque não usas uma factory acho que nesse caso seria o mais adequado, mas ao invés da factory padrão faz para apenas criar uma nova instância caso não tenha sido já criada.

I haven’t lost my mind; it’s backed up on DVD somewhere!

Link to comment
Share on other sites

As vantagens do Singleto não estarão em encapsular acessos à BD, nesse caso até seria de perguntar porque usar um Singleton para guardar o acesso à BD, tenha várias ou apenas uma instância, não há vantagens nenhuma em usar o padrão para isso.

Dando isso de barato, claro. Eu não uso, nem usaria, mas são opções como outras quaisquer.

@gatituh: para além de outras coisas, há aí um problema que entra pelos olhos dentro: tens dois construtores em estilos diferentes! Dependendo da versão de PHP que estás a usar, há um que não será executado; vê lá isso com atenção. Se puderes, usa a versão magic method, que é mais garantido que "sobreviva" nas próximas versões do PHP.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

@gatituh: para além de outras coisas, há aí um problema que entra pelos olhos dentro: tens dois construtores em estilos diferentes! Dependendo da versão de PHP que estás a usar, há um que não será executado; vê lá isso com atenção. Se puderes, usa a versão magic method, que é mais garantido que "sobreviva" nas próximas versões do PHP.

Obrigado  não tinha reparado  :wallbash:  ?

Isso que tens é quase uma pool em que tem limitas-te uma "slot" por tipo de ligação.

Porque não usas uma factory acho que nesse caso seria o mais adequado, mas ao invés da factory padrão faz para apenas criar uma nova instância caso não tenha sido já criada.

Estou agora a em iniciar nas patterns, mas a minha ideia era usar esta alteração de singleton criar instâncias á mesma base de dados, para tentar obter alguma performance e não criar chamadas á BD sem necessidade. Talvez a factory alterada me resolva o problema... vou experimentar !!  🙂

De qualquer maneira obrigado pelas dicas  😕

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.