Академический Документы
Профессиональный Документы
Культура Документы
PRIMEIRO PROGRAMA
EM PHP ORIENTADO A
OBJETOS
Leonardo Pimentel Ferreira
Higor Ernandes Ramos Silva
Página index.php
• Página index.php de um projeto recém-criado no
NetBeans.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Hello World
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
MVC (Model-View-Controller)
• Models:
• Partes do software que realizam funções relacionadas ao
domínio
• Os modelos possuem dados e operações
• Views:
• Componentes que mostram os dados aos usuários
• Dados vêm de um ou mais modelos
• Controller:
• Componentes que recebem e enviam comandos
• Controllers podem alterar views e models
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
MVC (Model-View-Controller)
• O usuário manipula apenas controllers (botões,
scrollbars).
MVC (Model-View-Controller)
Fonte: http://blog.stannard.net.au/blog/media/simple-mvc-framework/mvc.gif
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Criando o controle
• Por enquanto a nossa classe da camada controle está
bem simples.
• Vejam que ela já está se comunicando com o Modelo ao
instanciar a classe Login e invocando métodos do objeto
instanciado.
• Controle O.O.
• Controle procedimental.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Review...
• Até agora vimos:
• Classes;
• Objetos;
• Métodos(Construtor, GETTERs e SETTERs);
• Variáveis e atributos;
• Operador $this;
• Visibilidade private;
• Um pouco do MVC na prática;
• Criar formulário HTML;
• Capturar no PHP os dados enviados de um formulário HTML via
método POST;
• Daqui para frente iremos aprofundar mais em O.O.
Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Método destrutor
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
public function getNome(); //ou Default para os métodos – Em qualquer contexto é possível
public $nome;
function getNome(); acessá-lo. Visibilidade fraca.
https://minicurso-php-petsi-2013-2.googlecode.com/svn/trunk
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
• Para testar coloque os
trechos de código em
vermelho no arquivo de
controle do login:
clogin
Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Herança
• Houve algum erro? Do tipo
• Fatal error: Call to undefined function setNroVezesAcessado()
in C:\xampp\htdocs\minicurso\login\modelo\mlogincomum.php on line 8
Polimorfismo
• Implemente na classe ChequeEspecial os próprios
métodos CalcularJuros()e TipoCheque() dela.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Polimorfismo
• Crie um terceiro arquivo para exemplificar o uso do
polimorfismo.
<?php
require_once("cheque.php");
require_once("chequeespecial.php");
}
?>
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
• Para exemplificar o uso de interfaces, crie uma interface
chamada ILogin, que contém o método
imprimir_dados(Login $l). l é um objeto da classe
Login.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
• Feito isso, faça com que a classe abstrata Login
implemente a interface ILogin.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Interface
- Interfaces podem definir constantes. Constantes são uma espécie de
variável e cujo o seu valor não é alterado durante a execução do
programa. Ex.:
NOTA
Exercício Interface:
• Crie uma interface no projeto que declara pelo menos um
método. Em seguida, mostre um exemplo de como
utilizá-la.
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Ex.: $copia_do_objeto = clone $objeto;
• Adicione as linhas a seguir na classe de controle
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Resultado
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Clonagem de objetos
• Contornando o efeito indesejado do slide anterior.
Implemente o método mágico __clone() na classe de
modelo LoginComum
Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Comparação de objetos
• Existem duas maneiras de comparar objetos:
Comparação de objetos
<?php
include_once '../modelo/mlogincomum.php';
//Qualquer DAO de BD que implemente esta
interface terá que implementar as operações
interface ILoginComumDAO{
public function add(LoginComum $l);
public function atualiza(LoginComum
$l);
public function remove($usuario);
public function busca($usuario);
}
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
• Exemplo:
<?php
try {
$bd = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
print "Erro: " . $e->getMessage() . "<br/>";
die();//termina o script atual
//ou lançar exceção
//throw new Exception('Não foi possível conectar ao bd');
}
?>
Prepared Statement
• Oferecem dois grandes benefícios:
1. A consulta é preparada (parsed) apenas uma vez e
pode ser executada múltiplas vezes com diferentes
parâmetros, i.e, são customizáveis. Quando a
consulta é preparada o banco de dados analizará,
compilará e otimizará a consulta. Usando prepared
statement a aplicação evita repetir a análise,
compilação e otimização do ciclo. Isto significa que
prepared statements usam menos recursos e
assim rodam mais rápido.
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Prepared Statement
2. Os parâmetros dos prepared statements não necessitam de
ser quoted. O driver do servidor de BD automaticamente faz
isso. Isso certifica ao desenvolvedor que nenhuma SQL
injection ocorrerá (entretanto, se outras porções do código
da consulta estão sendo construída com entradas
unescaped, SQL injection é ainda possível).
//ou $stmt = $this->prepare("INSERT INTO LOGIN (log_user, log_senha) VALUES (?, ?)");
//$stmt->bindParam(1, $user);
//$stmt->bindParam(2, $senha);
$user = $l->getUsuario();
$senha= $l->getSenha();
//$user = 'x';
//$senha = 'y';
$stmt->execute();
return $stmt;
}
//... TEM MAIS CÓDIGO
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
if ($stmt->execute(array($usuario))) {
while ($row = $stmt->fetch()) {
print_r($row);
}
}
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Alterando o controle
• Para testar o método add, deixe o arquivo de controle clogin.php como abaixo:
<?php // controle/clogin.php
include_once '../modelo/mlogincomum.php';
include_once '../dao/logincomumdaomysql.php';
class cLogin{
private $msg;
function __construct() {
$login_comum = new LoginComum($_POST['usuario'], $_POST['senha']);
$loginComumDAO = new LoginComumDAOMySQL();
$stmt = $loginComumDAO->add($login_comum);
if($stmt->errorCode() == 0){
$this->msg = $login_comum->getUsuario(). " foi adicionado com sucesso";
}else{
$this->msg = $stmt->errorInfo()[2];
}
header("Location: ../visao/login.php?msg=$this->msg");
function __destruct() {
echo "Bye!"."<br>";
}
}
$clogin = new cLogin();//ou new cLogin
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Alterando a visão
<?php // visao/login.php
if(isset($_GET['msg'])){//imprime na visão a mensagem na url
echo $_REQUEST['msg']."<br>";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
</head>
<body>
<form method="post" action="../controle/clogin.php">
Usuário: <input type="text" name="usuario">
<br><br>
Senha: <input type="password" name="senha">
<input type="submit" value="Logar!">
</form>
</body>
</html>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Transação (ACID)
try {
$bd->beginTransaction();
$bd->exec(
"insert into staff (id, first, last) values
(23, 'Joe', 'Bloggs')");
$bd->commit();
} catch (Exception $e) {
$bd->rollBack();
echo "Failed: " . $e->getMessage();
}
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
$bd = null;
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Stored Procedures
• Prepared statements também podem chamar uma stored
procedure com parâmetros de entrada e saída.
<?php
?>
Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Drivers
Banco de dados Driver Banco de dados suportados
4D (PDO) PDO_4D 4D
CUBRID (PDO) PDO_CUBRID Cubrid
Firebird (PDO) PDO_FIREBIRD Firebird
IBM (PDO) PDO_IBM IBM DB2
Informix (PDO) PDO_INFORMIX IBM Informix Dynamic Server
MS SQL Server (PDO) PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
MS SQL Server (PDO) PDO_SQLSRV Microsoft SQL Server / SQL Azure
MySQL (PDO) PDO_MYSQL MySQL 3.x/4.x/5.x
ODBC and DB2 (PDO) PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
Oracle (PDO) PDO_OCI Oracle Call Interface
Constantes pré-definidas
• Geral
• http://us2.php.net/manual/pt_BR/pdo.constants.php
• Do MySQL
• http://us2.php.net/manual/pt_BR/ref.pdo-mysql.php
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Segurança em PHP
• Gerar senha criptografada com password_hash() a partir
do PHP 5.5.0
• Características:
• Cria senhas usando algoritmos hashing fortes (one-way);
• Compatível com a função crypt();
• Atualmente suporta dois algoritmos:
• PASSWORD_DEFAULT: usa atualmente o algoritmo BCRYPT e pode
gerar senhas de tamanhos variáveis. Para armazenar no BD o
recomendável é colocar a senha gerada em um campo de 255
caracteres.
• PASSWORD_BCRYPT: gera um resultado padronizado com a função
crypt() usando hash com identificador "$2y$". O resultado será sempre
uma string de tamanho 60 ou Falso em caso de falha.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Segurança em PHP
• Opções suportadas:
Segurança em PHP
• string password_hash ( string $password , i
nteger $algo [, array $options ] )
Exemplo 1
<?php
/**
* Usa o algoritmo padrão
*/
echo password_hash("rasmuslerdorf", PASSWORD
_DEFAULT). "<br>";
?>
• Saída:
• $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7
KnEd1rVAGv3Fykk1a
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo 2
/**
* Define o custo do algoritmo BCRYPT para 12 e o
salt é gerado randomicamente. Sempre gera 60
caracteres
*/
$options = [
cost => 12,
salt => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
• Saída:
• $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDx
Y3K
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Verificar senha
boolean password_verify ( string $password , string
$hash )
if (password_verify('rasmuslerdorf', $hash)) {
echo ‘Senha válida!';
} else {
echo ‘Senha inválida.';
}
Exercícios
• Utilize a função password_hash() para criar a hash da
senha do usuário antes de salvaguardar o registro no
banco de dados. Veja o resultado no banco de dados.
Uma solução:
• Crie um método para comparar a senha e outro que gere
o hash da senha.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Uma solução:
• Na camada DAO altere onde é necessário definir o HASH
da senha. Neste caso, nas funções de adicionar e
atualizar.
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Uma solução:
• Apenas testando no controle
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• Limite o poder dos usuários do seu banco ou de um usuário do
Apache
• Nunca atribua poderes de admin a usuários comuns
Dicas de segurança
• Estabeleça quando necessário conexões sobre SSL
(HTTPS = HTTP + SSL) para criptografar comunicações
cliente/servidor para aumentar a segurança.
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY n
ame LIMIT 20 OFFSET $offset;";
?>
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Exemplo 2
• Exemplo #1 Uso Perigoso de Variáveis
• <?php
// remove um arquivo do diretório home do usuário... ou talvez
// de outra pessoa?
unlink ($evil_var);
?>
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Dicas de segurança
• Adicione aspas para cada valor não numérico que será
passado para o banco de dados com as funções de caracteres
de escape. Ex.:mysql_real_escape_string(). Ou
funções addslashes() e str_replace()
Dicas de segurança
•O XAMPP avisa-o quando alguns problemas de
segurança ocorrem.
Dicas
• Trabalhar com PHP em modo error_reporting (E_ALL)
também pode ajudar avisando sobre variáveis sendo
usadas antes de serem checadas ou inicializadas (então
você pode prevenir que dados incomuns sejam
operados).
• TESTAR
• Captcha
• Mantenha-se atualizado!
Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Outros sites
• Conectando PHP ao MySQL:
http://us2.php.net/manual/pt_BR/ref.pdo-
mysql.connection.php
• http://us2.php.net/manual/pt_BR/class.pdostatement.php
Bootstrap
• Framework de front-end
• Características:
• Estrutura simples, intuitiva e poderosa para o desenvolvimento
web mais rápido e mais fácil;
• Customizável;
• Responsível;
• Não é necessário ter grandes conhecimentos em CSS3.
Usando o Bootstrap
• Baixe ele em
http://globocom.github.io/bootstrap/assets/bootstrap.zip
• Extraia-o para a pasta de visao do projeto.
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Usando o Bootstrap
• Adicione no arquivo de visão login.php as seguintes
diretivas para incluir o css e javascript.
Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia
Usando o Bootstrap
• Veja a diferença com e sem bootstrap respectivamente.
• É bem simples mudar a cor do botão, basta colocar a classe
na tag html que fará com que o botão por exemplo seja azul
<input class="btn btn-primary" type="submit"
value="Logar!">
• Uma lista de classes disponíveis em CSS podem ser
encontradas em http://globocom.github.io/bootstrap/base-
css.html#buttons