You are currently browsing Pablo Dall'Oglio’s articles.

Palavras-chave: PHP5, Orientação a objetos, carregar, classes, __autoload

Quando programamos aplicações orientadas a objetos um dos aspectos importantes a se observar é a responsabilidade e a orientação à assunto. Isto quer dizer que cada classe deve ser responsável por um determinado assunto e ser responsável por ele, ou seja, protejer os aspectos internos de implementação.

Dessa forma, facilmente criamos aplicações com dezenas de classes, uma vez que cada classe irá cuidar de um aspecto bem específico. Teremos classes para botões, janelas, conexões com o banco de dados, etc.

Nestes casos, é comum encontrar no início de um arquivo, vários “include_once”, responsáveis por carregar as inúmeras classes necessárias no script, como:

<?php
include_once 'classes/Botao.class.php';
include_once 'classes/Cliente.class.php';
include_once 'classes/Fornecedor.class.php';

// ... código ...

?>

Em muitos casos, corremos inclusive o erro de esquecer um include, tantas são as classes utilizadas pelo nosso sistema. Para facilitar o carregamento das classes, o PHP5 introduz o método __autoload().

O método __autoload() é executado automaticamente na primeira vez que uma classe é instanciada. Nele podemos escrever algumas tarefas automáticas como o próprio carregamento da classe em memória.

<?php
function __autoload($classe)
{
   include_once "classes/{$classe}.class.php";
}

// ... código ...

new Cliente;

new Fornecedor;

?>

Desta forma, sempre que uma classe for instanciada pela primeira vez, o método __autoload é executado e a classe correspondente é carregada.

Palavras-chave: PHP5, IF, atribuição condicional, ternário

Um dos comandos mais utilizados nos nossos programas sem dúvida é o IF. Quando utilizamos o IF para tarefas simples como realizar um teste condicional para posterior atribuição de variáveis, podemos utilizar uma sintaxe simplificada.

A seguir, veja um exemplo onde atribuímos a variável $texto dependendo do conteúdo da variável $idade.

<?php
$idade =16;

if ($idade > 18)
{
   $texto = "maior idade";
}
else
{
   $texto = "menor idade";
}

echo $texto;
?>

O PHP nos oferece uma sintaxe onde podemos realizar uma atribuição condicional de variáveis, onde o IF acima pode ser substituído pela seguinte forma:

<?php
$idade =16;
$texto = $idade > 18 ? "maior idade" : "menor idade";
echo $texto;
?>

Palavras-chave: PHP, strings, substr, strpos

Um dos tipos de dados com mais recursos na linguagem PHP é sem dúvida as strings. A linguagem PHP possui inúmeras funções para manipulação de strings e uma das mais utilizadas é o substr.

O substr é responsável por retornar um pedaço da string. Para isto ele se utiliza de três parâmetros: a própria string, o índice inicial e a quantidade de caracteres a ser retornada.

Acontece que podemos utilizar também um índice negativo, desta forma o PHP analisa a string contando N caracteres a partir do final, e não a partir do início. Veja a seguir alguns exemplos:

<?php
$texto = "eu não sou besta pra tirar onda de herói";

echo substr($texto, 0, 16);  // eu não sou besta
echo "<br>\\n";
echo substr($texto, 11);     // besta pra tirar onda de herói
echo "<br>\\n";
echo substr($texto, 11, 9);  // besta pra
echo "<br>\\n";
echo substr($texto, -5);     // herói
echo "<br>\\n";
?>

Também podemos utilizar a substr() em combinação com a strpos(). A strpos detecta a posição que uma string ocorre dentro de uma expressão.

No exemplo seguinte, detectamos onde ocorre a palavra “http://” para retornar somente o domínio presente no texto:

<?php
$texto = "retornarei somente o domínio de http://www.pablo.blog.br";
$posicao = strpos($texto, 'http://');
echo substr($texto, $posicao+11); // pablo.blog.br
echo "\\n<br>";
?>

Palavras-chave: PHP, arrays, strings, implode, explode

De todos os tipos de dados presentes nas linguagens de programação, arrays e strings certamente estão entre os mais utilizados. E em PHP isto não é diferente. Muitas vezes temos a necessidade de conversão de uma estrutura para outra. Aqui vamos ver como fazer a conversão de arrays para strings e vice-versa.

Primeiramente, temos uma string contendo uma lista de nomes separados por vírgula e iremos convertê-la em um array. Para tal, utilizamos a função explode especificando o caractere separador.

<?php
$string = "joão, maria, josé, pedro";
$array  = explode(',', $string);
print_r($array);
?>

Agora iremos fazer o contrário, ou seja, converter um array para uma string. Para tal, iremos utilizar a função implode(), passando o caractere que desejamos utilizar para separar os dados na string.

<?php
$array[] = "www.adianti.com.br";
$array[] = "www.pablo.blog.br";
$array[] = "www.php-gtk.com.br";

print_r(implode(':', $array))
?>

Palavras-chave: PHP, Classes, Objetos, Reflection API

No PHP existem diversas formas de se descobrir informações a respeito de uma classe. Por exemplo, para saber quais os métodos oferecidos por uma classe, a função get_class_methods() é utilizada:

<?php
class Pessoa
{
    private $codigo;
    private $name;
    function __construct($codigo)
    {
        $this->codigo = $codigo;
    }

    function setName($name)
    {
        $this->name = $name;
    }
}

print_r(get_class_methods('Pessoa'));
?>

O PHP5 implementa uma API chamada Reflection. A Reflection API permite fazermos reflexão de objetos, ou seja, investigar sobre seus atributos, métodos e descobrir sua interface. A seguir, temos o mesmo código rescrito utilizando essa API:

<?php
class Pessoa
{
    private $codigo;
    private $name;
    function __construct($codigo)
    {
        $this->codigo = $codigo;
    }

    function setName($name)
    {
        $this->name = $name;
    }
}

$api = new ReflectionClass('Pessoa');
foreach($api->getMethods() as $method)
{
    echo $method->getName() . "<br>\\n";
}
?>

Palavras-chave: PHP, funções, argumentos

Você sabia que o PHP aceita a chamada de funções com argumentos variados?

Normalmente definimos os parâmetros a serem recebidos na assinatura da função (declaração). Mas quando não sabemos a quantidade exata de métodos a serem recebidos, podemos utilizar a função func_get_args(), que irá retornar um array contendo os parâmetros passados na chamada da função.

Como exemplo veja a função soma(), que pode receber uma quantidade variada de argumentos, retornando seu somatório.

<?php
function soma()
{
    $parametros = func_get_args();
    foreach ($parametros as $parametro)
    {
        $soma += $parametro;
    }
    return $soma;
}

echo soma(1,2) . "<br>\\n";
echo soma(1,2,3) . "<br>\\n";
echo soma(1,2,3,4,5,6) . "<br>\\n";
?>

Palavras-chave: PHP5, Orientação a objetos, classes, unicidade, __toString()

Um dos conceitos na orientação a objetos é a unicidade. Cada objeto é único no sistema, não existem dois objetos iguais.

Você constata isto simplesmente imprimindo o objeto na tela, pois o sistema irá exibir o OID (object identificator) do objeto em memória. Cada objeto possui um OID diferente.

Caso você queira que o sistema exiba outra informação ao imprimir o objeto, utilize o método __toString(), ele permite redefinir o comportamento padrão ao se utilizar, por exemplo, o comando “print” ou “echo” sobre um objeto, sendo interessante para fins de debug.

A seguir temos duas classes e um objeto de cada classe. A primeira não utiliza o __toString(), sendo exibido o OID do objeto, a segunda utiliza, sendo exibido o nome da pessoa.

<?php
class Automovel
{
    private $modelo;

    function setModelo($modelo)
    {
        $this->modelo = $modelo;
    }
}

class Pessoa
{
    private $nome;

    function setNome($nome)
    {
        $this->nome = $nome;
    }

    function __toString()
    {
        return '#'.$this->nome;
    }
}

$palio = new Automovel;
$palio->setModelo('Palio ED 1.0');
echo $palio; // resultado = Object id #1
echo "\\n<br>\\n"; //quebra linha

$maria = new Pessoa;
$maria->setNome('Mariana Pereira');
echo $maria; // resultado = #Mariana Pereira
echo "\\n<br>\\n"; //quebra linha
?>

Palavras-chave: PHP, Iterators, diretórios, percorrer, iterar, SPL

A forma mais comum de se ler o conteúdo de um diretório em PHP é utilizando um laço de repetição WHILE em conjunto com as funções opendir() e readdir(), como no exemplo a seguir:

<?php
$dir = opendir('/tmp');
while ($arquivo = readdir($dir))
{
    echo "$arquivo<br>\\n";
}
closedir($dir);
?>

O uso da função readdir() é simples, permite iterar por todos os arquivos de um diretório. Quando a leitura do diretório acabar, a função retorna FALSE, caindo fora do loop. Porém, se existir algum arquivo com o nome “0″, a função retornará vazio, e a comparação também abortará o loop. A solução é simples, basta uma comparação absoluta com o valor FALSE:

while (($arquivo = readdir($dir)) !== FALSE)

Apesar de simples, estes testes são suscetíveis ao esquecimento do programador. Felizmente o PHP5 introduz iterators, que são uma forma bem mais elegante de se percorrer cadeias de informações. Existem iterators para bancos de dados, XML e sistema de arquivos, é claro. O exemplo anterior, reescrito utilizando iterators, ficaria assim:

<?php
foreach (new DirectoryIterator('/tmp') as $arquivo)
{
    echo "$arquivo<br>\\n";
}
?>

O Iterator DirectoryIterator existe para se percorrer o sistema de arquivos e ele tem vários recursos adicionais, como filtros (FilterIterator), que permite exibir somente os resultados que satisfaçam o filtro.

O iterator é implementado sob a forma de uma classe que segue uma interface rígida. Podemos criar iterators para várias tarefas. Os iterators são parte do PHP5 e são providos pela extensão SPL (Standard PHP Library).

Add to Technorati Favorites

Assuntos