Fabyo 66 Denunciar post Postado Fevereiro 21, 2007 Nesse tutorial vou comentar um pouco sobre Padrões de projetos abordarei sobre classes com "singleton", e mostrar alguns exemplos de codigos para um entendimento melhor recomendo ler os tutoriais abaixo: http://pt.wikipedia.org/wiki/Padrões_de_projeto_de_software http://pt.wikipedia.org/wiki/Singleton http://br.php.net/manual/pt_BR/language.oop5.patterns.php http://br2.php.net/static exemplo de singleton com PHP4: <?php class Classe { var $Numero; function Classe() { $this->Numero = rand(); } function &Singleton() { if(!session_id()) { session_start(); } if(!isset($_SESSION['classe'])){ $_SESSION['classe'] = new Classe(); } return $_SESSION['classe']; } function Mostrar() { echo "Usando singleton = " . $this->Numero . "<br />"; } } $a = Classe::Singleton(); $a->Mostrar(); unset($a); $a = Classe::Singleton(); $a->Mostrar(); $b = Classe::Singleton(); $b->Mostrar(); resultado: Usando singleton = 8835Usando singleton = 8835 Usando singleton = 8835 depois de terem lido os tutoriais acima e entenderam esse exemplo, podem ver ao testar o script acima o valor de rand() sempre será o mesmo, nao importa quantas classe você inicie ou quantas variaveis crie sempre será a mesma estancia da classe. agora o mesmo exemplo mas sem usar o recurso "singleton": <?php class Classe2 { var $Numero; function Classe2() { $this->Numero = rand(); } function Mostrar() { echo "Sem singleton = " . $this->Numero . "<br />"; } } $a = new Classe2(); $a->Mostrar(); unset($a); $a = new Classe2(); $a->Mostrar(); $b = new Classe2(); $b->Mostrar(); ?> resultado: Sem singleton = 19456Sem singleton = 3129 Sem singleton = 17022 pelo exemplo podem ver que os valores de rand sempre são diferentes, ou seja é estanciado novas classe sempre. agora um exemplo de singleton para PHP5 onde podemos usar um recurso melhor da linguagem: ressaltanto: Uma variável estática ("static") existe somente no escopo local da função, mas ela não perde seu valor quando o nível de execução do programa deixa o escopo PHP5 : <?php class exemplo { static private $instance = null; //Deixamos o metodo construtor como private para nao permitir que a classe seja estanciada com new private function __construct(){} //A palavra-chave 'final' previne que classes filhas sobrecarreguem um método ou variável nao permitindo que essa classe seja clonada public final function __clone() { trigger_error('Nao é possivel clonar uma classe singleton', E_USER_ERROR); } public static function singleton() { if (!self::$instance instanceof self) { self::$instance =& new self(); } return self::$instance; } } /*Nota: A não utilização do operador & causará a cópia do objeto. Se você utiliza $this em classes, ele operará na instância atual do objeto. A assimilação sem & irá copiar a instância (o objeto em si) e $this irá operar na cópia, podendo não ser esse procedimento sempre desejável. Normalmente você precisará trabalhar com uma instância única, seja por motivos de performance ou de consumo de memória. */ $classe =& exemplo::singleton(); ?> outro exemplo para um melhor entendimento: <?php class Singleton { private static $instanceMap = array(); protected function __construct() {} public final function __clone() { trigger_error('Nao é possivel clonar uma classe singleton', E_USER_ERROR); } public function getInstance($className) { if(!isset(self::$instanceMap[$className])) { $object = new $className; if($object instanceof Singleton){ self::$instanceMap[$className] = $object; } } return self::$instanceMap[$className]; } } class A extends Singleton { protected $Numero; protected function __construct() { $this->Numero = rand(); } public function Mostrar() { echo get_class( $this ) . ' (' . $this->Numero . ')<br />'; } } class B extends A { } $a = Singleton::getInstance( "A" ); $b = Singleton::getInstance( "B" ); $a->Mostrar(); $b->Mostrar(); unset( $a ); $c = Singleton::getInstance( "A" ); $d = Singleton::getInstance( "B" ); $c->Mostrar(); $d->Mostrar(); ?> resultado: A (1237)B (9450) A (1237) B (9450) como podem ver as mesmas classes possuem os mesmo numeros no resultado acima, isso mostra que a classe foi estanciada apenas 1 vez. http://br2.php.net/instanceof http://br.php.net/manual/pt_BR/function.is-a.php -> bom para PHP4 mas esta obsoleto para PHP5 http://br.php.net/manual/pt_BR/function.get-class.php http://br2.php.net/manual/pt_BR/language.oop5.final.php http://br.php.net/manual/pt_BR/language.references.php http://www.oodesign.com.br/forum/index.php?act=idx ja que eu abordei o assunto de singleton para php4, irei mostrar tambem como usar construtores e destrutores em php4 veja exemplo de uma classe com __construct e __destruct funcionando em PHP4 <?php class classe1 { function classe1() { if(!method_exists("__construct")) { $args = func_num_args() > 0 ? func_get_args() : array(); call_user_func_array(array(&$this, '__construct'), $args); } register_shutdown_function (array(&$this, '__destruct')); } function __construct() { echo "Usando construtor no PHP4<br />"; } function __destruct() { echo "Usando destrutor no PHP4"; } } Essa classe poderia ser feita com recursos de PHP 5 que funcionaria herdando a classe PHP4 acima class classe2 extends classe1 { function __construct() { parent::__construct(); } } $a = new classe1(); $b = new classe2(); ?> resultado: Usando construtor no PHP4 Usando construtor no PHP4 Usando destrutor no PHP4 Usando destrutor no PHP4 uma função se torna um construtor quando ele tem o mesmo nome da classe. No PHP 4, uma função se torna um construtor quando ele tem o mesmo nome da classe onde ela foi definida como a maioria sabe para usar construtores em php4 basta criar um metodo com o mesmo nome da classe como no exempo acima, mas se quiser que seu script ja esteja no padrao correto e que seja herdado por um script PHP5 sem ter erros criei o metodo __construct em PHP4 assim você pode herdar essa classe num script php5 usando "parent::__construct();" veja o exemplo na classe2 http://br.php.net/method_exists http://br2.php.net/manual/pt_BR/language.oop.constructor.php http://br2.php.net/manual/pt_BR/language.oop5.decon.php http://br.php.net/call_user_func_array http://br2.php.net/func_num_args http://br2.php.net/register_shutdown_function Compartilhar este post Link para o post Compartilhar em outros sites
Carlos Vital 0 Denunciar post Postado Fevereiro 21, 2007 Ótimo tutorial... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites
MagicalTrevor 0 Denunciar post Postado Fevereiro 21, 2007 excelente!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites
Perfect Lion 10 Denunciar post Postado Fevereiro 21, 2007 Sem comentarios... opa comentei :P hahahhahaMuito f*** mesmo e eu aconselho todos s lerem isso ai.. por um projeto mais organizado e facil de se entender =D eu ja trabalho com esses padrões e recomendo Compartilhar este post Link para o post Compartilhar em outros sites
Carlos Vital 0 Denunciar post Postado Fevereiro 22, 2007 Oi Fabyo, tudo bem? Estava pensando aqui... já que você está fazendo esses artigos sobre Design Patterns e padrões de desenvolvimento, porque não faz um sobre MVC(Claro que se você puder... e também se você achar a idéia boa, OK! )... Seria muito bom e ajudaria muita gente, inclusive eu rsrsrs. Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Fevereiro 23, 2007 com certeza, ja estava nos nossos planos, nao sei se voce reparou nos ultimos tutoriais postados aqui, estamos preparando varios tutoriais desdo basico ate coisas avançadas Compartilhar este post Link para o post Compartilhar em outros sites
Carlos Vital 0 Denunciar post Postado Fevereiro 23, 2007 Que bom! :) nao sei se voce reparou nos ultimos tutoriais postados aquiEu leio todos os tutoriais que são postados. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites