Mostrando postagens com marcador orientação objeto. Mostrar todas as postagens
Mostrando postagens com marcador orientação objeto. Mostrar todas as postagens

segunda-feira, 19 de maio de 2008

Variáveis Variantes (variable variables) - PHP

Em algumas ocasiões em um projeto você se ve no seguinte dilema.
"Tenho que trocar não só o valor da variável mas o nome desta também, mas como fazer?"
Claro que isto vai acontecer bem raramente mas, pode acontecer.
Pensando nisso o PHP traz o conceito de variável variante, que nada mais é que você conseguir trocar o nome da variável usando o valor de outra variável. Confundiu?
Bem vamos ao código que fica mais facíl.
Ex:

<?php
$strVariavell = 'strPessoa1';
$strVariavel2 = 'strPessoa2';

//aqui você cria a variável de nome strPessoa1
//com o valor de Tiago Finger
$$strVariavell = 'Tiago Finger';

//vamos ver o valor de strPessoa1
echo $$strVariavell;

//aqui você cria a variável de nome strPessoa2
//com o valor de Zeca Urubu
$$strVariavel2 = 'Zeca Urubu';

//quebra para a próxima linha
echo '<br />';

//vamos ver o valor de strPessoa2
//imprime Zeca Urubu
echo $strPessoa2;
?>

Toda a vez que se usa $$nomeVariavel, você está usando o conceito de variáveis variantes ou seja o conteúdo de $nomeVariavel será o nome da variável em questão.
Assim se pode criar objetos e variáveis dinâmicamente com o $$ antes do nome da variável.

Falou galera!
Abraço.

PHP 5 - Funções que auxiliam a nossa vida

No PHP 5 temos algumas funções que ajudam e muito, a facilitar nossa vida de programador.
Por exemplo:
__autoload($nome_classe) = função que carrega classes ao ser instanciada pela primeira vez.
Ex:


<?php
//executa a função __autoload para carregar as classes
function __autoload($strNomeClasse)
{
//se tiver classes em vários lugares se cria um array com as pastas
$arrPasta = array('classes');

//verifica as pastas que contém as classes
foreach ( $arrPasta AS $strNomePasta )
{
//se existe o arquivo carrega ele
if( file_exists("$strNomePasta/$strNomeClasse.class.php" ) )
{
include_once("$strNomePasta/$strNomeClasse.class.php");
}
}
}
//instancia a classe
$objClass1 = new Class1();
$objClass1->mostra();
?>


__set($nome_propriedade, $valor) = intercepta toda a atribuição em uma classe e seta os atributos.
Ex:


<?php
/**
* Classe de exemplo
* @author Tiago Finger
* @version 1.0
* @package teste
*/
class Exemplo
{
/**
* @var int $intPropriedade1 primeiro atributo da classe
* @access private
*/
private $intPropriedade1;

/**
* @var int $intPropriedade2 segundo atributo da classe
* @access private
*/
private $intPropriedade2;

/**
* Usado para setar os atributos da classe
* @param string $strPropriedade nome do atributo da classe
* @param mixed $mixValor valor da propriedade
* @return void
* @access public
*/
public function __set($strPropriedade, $mixValor)
{
$this->$strPropriedade = $mixValor;
}

/**
* Retorna a soma de $intPropriedade1 e $intPropriedade2
* @param void
* @return int
* @access public
*/
public function somar()
{
$intSoma = $this->intPropriedade1 + $this->intPropriedade2;
return $intSoma;
}

}

//cria instância da classe exemplo
$objExemplo = new Exemplo();

//seta valores dos atributos da classe
$objExemplo->__set('intPropriedade1', 2);
$objExemplo->__set('intPropriedade2', 10);

//executa metódo
echo 'Valor total = '.$objExemplo->somar();
?>



__get($propriedade) = intercepta toda requisição da classe e retorna o atributo.
Ex:


<?php
/**
* Classe de exemplo
* @author Tiago Finger
* @version 1.0
* @package teste
*/
class Exemplo
{
/**
* @var int $intPropriedade1 primeiro atributo da classe
* @access private
*/
private $intPropriedade1;

/**
* @var int $intPropriedade2 segundo atributo da classe
* @access private
*/
private $intPropriedade2;

/**
* Usado para setar os atributos da classe
* @param string $strPropriedade nome do atributo da classe
* @param mixed $mixValor valor da propriedade
* @return void
* @access public
*/
public function __set($strPropriedade, $mixValor)
{
$this->$strPropriedade = $mixValor;
}

/**
* Usado para pegar os atributos da classe
* @param string $strPropriedade nome do atributo da classe
* @return void
* @access public
*/
public function __get($strPropriedade)
{
return $this->$strPropriedade;
}

/**
* Retorna a soma de $intPropriedade1 e $intPropriedade2
* @param void
* @return int
* @access public
*/
public function somar()
{
$intSoma = $this->intPropriedade1 + $this->intPropriedade2;
return $intSoma;
}

}

//cria instância da classe exemplo
$objExemplo = new Exemplo();

//seta valores dos atributos da classe
$objExemplo->__set('intPropriedade1', 2);
$objExemplo->__set('intPropriedade2', 10);

//retorna propriedade
echo 'Primeiro atributo do objeto = '.
$objExemplo->__get('intPropriedade1').'<br />';
echo 'Segundo atributo do objeto = '.
$objExemplo->__get('intPropriedade2').'<br />';
?>



Falou galera!
Abraços.