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);
}
}
?>







Comentários Recentes