Ir para conteúdo

POWERED BY:

Arquivado

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

Fabyo

Design Patterns

Recommended Posts

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 = 8835

Usando 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 = 19456

Sem 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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.