You are currently browsing the category archive for the 'PHP' category.

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).

Palavras-chave: PHP, INI, configuração, parsing

Arquivos .INI são comumente utilizados para armazenar informações sobre a configuração das aplicações. Caminhos de diretórios, caminhos de programas externos, usuários, senhas, dentre outros.

Em aplicações PHP é extremamente simples realizar a leitura de arquivos INI. Para isto existe a função parse_ini_file(). Ela lê o INI e retorna um array multidimensional (matriz) indexado pela chave de cada linha. Inclusive, se o arquivo INI tiver seções, estas seções poderão ser utilizadas como chaves deste array. Veja:

arquivo INI:
==============
; Exemplo de arquivo .INI
; Isto é um comentário
[paths]
app=/usr/local/programa
temp=/tmp

[layout]
cor=vermelho
fonte=arial
tamanho=12

arquivo PHP:
==============
<?php
// primeiro vamos realizar a leitura
// simples do INI, cada chave é transformada
// em um índice do array unidimensional
$ini = parse_ini_file('config.ini');
print $ini['temp'] . "<br>";
print $ini['fonte'] . "<br>";

// agora iremos respeitar a hierarquia das
// seções do INI. O segundo parâmetro faz
// com que as seções sejam as chaves de acesso
// para este array multi-dimensional
$ini = parse_ini_file('config.ini', true);
print $ini['paths']['temp'] . "<br>";
print $ini['layout']['fonte'] . "<br>";
?>

Palavras-chave: PHP, enviar, e-mail, email, gmail, evolution

Uma das coisas mais chatas em PHP é enviar email. Não por causa do PHP, mas porque cada software cliente de email trata os headers de uma maneira diferente.

Passei uma madrugada dessas quebrando a cabeça, porque os emails funcionavam no Evolution, mas não no Gmail. Depois funcionavam no Gmail, mas não no Evolution. Quando consegui fazer funcionar nos dois, empacotei tudo numa classe.

E aí está, para ajudar outros a não quebrarem a cabeça :-)

<?php
/*
 * Classe Mail
 * para envio de emails
 */
class Mail
{
    private $parts;

    /*
     * Método construtor
     */
    function __construct()
    {
        $this->parts = array();
        $this->boundary = md5(time());
    }

    /*
     * Adiciona HTML
     */
    function addHtml($body)
    {
        $body = stripslashes($body);
        $msg  = "--{$this->mime_boundary}\\n";
        $msg .= "Content-Type: text/html; charset=ISO-8859-1\\n\\n";
        $msg .= $body;

        $this->parts[] = $msg;
    }

    /*
     * Adiciona Texto
     */
    function addText($body)
    {
        $body = stripslashes($body);
        $msg  = "--{$this->mime_boundary}\\n";
        $msg .= "Content-Type: text/plain; charset=ISO-8859-1\\n\\n";
        $msg .= $body;

        $this->parts[] = $msg;
    }

    /*
     * Adiciona Imagem
     */
    function addPng($filename, $download)
    {
        $fd=fopen($filename, 'rb');
        $contents=fread($fd, filesize($filename));
        $contents=chunk_split(base64_encode($contents),68,"\\n");
        fclose($fd);

        $msg  = "--{$this->mime_boundary}\\n";
        $msg .= "Content-Type: image/png; name={$download}\\n";
        $msg .= "Content-Transfer-Encoding: base64\\n";
        $msg .= "Content-Disposition: attachment; filename={$download}\\n\\n";
        $msg .= "{$contents}";

        $this->parts[] = $msg;
    }

    /*
     * Envia Email
     */
    function send($from, $to, $subject)
    {
        $headers  = "From: {$from}\\n";
        $headers .= 'Content-Type: multipart/mixed; boundary="'.$this->mime_boundary."\"\\n";
        $headers .= 'X-Mailer: PHP-' . phpversion() . "\\n";
        $headers .= "Mime-Version: 1.0\\n\\n";

        $msg = implode("\\n", $this->parts);

        mail($to, $subject, $msg, $headers);
    }
}
?>

Palavras-chave: PHP, vetor, array, objeto, index

Este trecho de código abaixo é muito útil pois é um modelo de como converter vetores (arrays) em objetos no PHP.

O funcionamento é bastante simples, ele pega um array indexado e o converte em um objeto onde os índices do array serão os nomes das propriedades dos objetos, e o valor do array naquela posição (índice), será o valor da propriedade. O segredo todo está no foreach ;-)

<?php

$a['cor'] = 'azul';
$a['potencia'] = '1000';
$a['marca'] = 'fiat';
$a['modelo'] = 'palio';

foreach ($a as $key => $value)
{
    $objeto->$key = $value;
}
echo $objeto->cor;
echo $objeto->potencia;
echo $objeto->marca;
echo $objeto->modelo;
?>

Palavras-chave: PHP, thumbnail, Imagens, GD

A grande maioria dos sites precisa gerar algum tipo de thumbnail ou pré-visualização em miniatura a partir de uma foto submetida ou de uma screenshot.

Abaixo segue uma pequena função em PHP que recebe uma imagem e gera outra, com a nova largura especificada, a altura é automaticamente calculada para manter a proporção em relação à imagem original. A imagem é redimensionada mantendo-se a qualidade de 100% (válido especialmente para o formato JPEG).

/*
 * Método geraThumb
 * Gera thumbnail a partir da foto
 */
function geraThumb($photo, $output, $new_width)
{
    $source = imagecreatefromstring(file_get_contents($photo));
    list($width, $height) = getimagesize($photo);
    if ($width>$new_width)
    {
        $new_height = ($new_width/$width) * $height;
        $thumb = imagecreatetruecolor($new_width, $new_height);
        imagecopyresampled($thumb, $source, 0, 0, 0, 0,
            $new_width, $new_height, $width, $height);
        imagejpeg($thumb, $output, 100);
    }
    else
    {
        copy($photo, $output);
    }
}
?>
Add to Technorati Favorites

Assuntos