Share
Embed
PHP: Começando do jeito certo!
Jonata Weber
March 02, 2015
Transcript
85 slides
-
Agenda • Por que aprender PHP? • Principais Funcionalidades •
PHP Básico e OO • Prática • Onde continuar estudando? -
Popularidade • 82% das linguagens web server-side * • facebook.com,
wikipedia.org, baidu.com, wordpress.com (+ CMS), etc… • Content Management System (CMS) • Drupal, Joomla, Magento, OpenCart, etc * Fonte: http://w3techs.com (01/03/2015) -
Maturidade • 1995 – Tornou-se público • 1998 – 60.000
domínios com PHP (1% da internet) • 2004 – PHP 5 e Sólido modelo de OO • 2009 – PHP 5.3 (Funções Anônimas e Namespace) • 2012 – PHP 5.4 (Traits) • 2013 – PHP 5.5 (Generators, finally) • 2014 – PHP 5.6 (Variadic Functions, phpdbg) -
Padrões • PHP Framework Interop Group (PHP-FIG) • PHP Standard
Resources (PSR) • PSR-0 – Autoloading Standard • PSR-1 – Basic Coding Standard • PSR-2 – Coding Style Guide • PSR-3 – Logger Interface • PSR-4 – Improved Autoloading -
• Orientação a Objetos (>= 5.0) • Programação Funcional (>=
5.3) • Namespaces (>= 5.3) • Traits (>= 5.4) • Servidor Web Embutido (>= 5.4) • Command Line Interface (CLI) Principais Funcionalidades -
Principais Funcionalidades • Meta Programming • Métodos mágicos e Reflection
API • Mistura de Interpretação e Compilação • Opcode Cache • Fracamente Tipada (JS, Ruby, Python, etc) • Tratamento de Exceções (try, catch e finally) -
Principais Ferramentas • PHPUnit (TDD) e Behat (BDD) • Gerenciamento
de Dependências (Composer e Pear) • XDebug e PHPDBG • PHPDoc -
Windows 1. Baixar arquivo ZIP http://windows.php.net/ 2. Descompactar na pasta
c:\php5x 3. Adicionar c:\php5x a variável de ambiente PATH Linux $ sudo apt-get update $ sudo apt-get install php55 -
Bloco de Notas <?php echo ‘Hello World’; ?> Salvar na
pasta “c:\php5x\www” como "hello.php" -
Inicializar o Servidor Web No console, acesse a pasta dos
scripts php e depois digite: $ php -S localhost:8000 -
Tipos Primitivos • Boolean • Integer • Float • String
• Array • NULL • Object -
Boolean <?php $variavel = true; $variavel = false; $variavel =
(50 == '50'); // true $variavel = (50 != '50'); // false $variavel = (50 === '50'); // false $variavel = (50 !== '50'); // true -
Integer e Float <?php $variavel = 50; // decimal $variavel
= -123; // número negativo $variavel = 0123; // octal $variavel = 0x1A; // número hexadecimal (26 decimal) $variavel = 1.234; // ponto flutuante $variavel = 2**3; // 8 (PHP >= 5.6) -
String Aspas Simples <?php echo ‘essa é uma simples string';
echo ‘Além disso, você pode embarcar novas linhas nas strings, esse é um caminho legal de fazer'; // Outputs: Arnold once said: "I'll be back" echo 'Arnold once said: "I\'ll be back"'; -
<?php // Outputs: Você deletou C:\*.*? echo 'Você deletou C:\\*.*?';
// Outputs: Você deletou C:\*.*? echo 'Você deletou C:\*.*?'; // Outputs: Isso não vai criar: \n uma nova linha echo ‘Isso não vai criar: \n uma nova linha'; // Outputs: Variáveis não funcionam $expand $either assim echo ‘Variáveis não funcionam $expand $either assim'; String Aspas Simples -
<?php $variavel = 'Legal'; // Outputs: Variáveis funcionam assim: Legal
echo “Variaveis funcionam assim: $variavel”; String Aspas Duplas -
Array <?php $array = array("foo", "bar", "hello", "world"); $array =
["foo", "bar", "hello", "world"]; // PHP >= 5.4 -
Array Sintaxe: array( key => value, key2 => value2, key3
=> value3, ... ) <?php $variavel = array( "chave1" => "valor1", "chave2" => "valor2", ); // as of PHP 5.4 $variavel = [ "chave1" => "valor1", "chave2" => "valor2", ]; -
Array <?php $array = array( "foo" => "bar", "bar" =>
"foo", 100 => -100, -100 => 100, ); var_dump($array); Saída: array(4) { ["foo"]=> string(3) "bar" ["bar"]=> string(3) "foo" [100]=> int(-100) [-100]=> int(100) } -
Array <?php $variavel = array(5 => 1, 12 => 2);
$variavel[] = 56 // Isso é o mesmo que $variavel[13] = 56; $variavel["x"] = 42; // Isso adiciona um novo elemento // com a chave "x" unset($variavel[5]); // Isso remove o elemento do array unset($variavel); // Isso delete o array -
Funções <?php function helloWorld() { echo 'Hello World'; } helloWorld();
// Hello World function maiusculo($texto) { return strtoupper($texto); } echo maiusculo('jonata weber'); // JONATA WEBER -
IF / ELSEIF / ELSE <?php $a = 60; $b
= 60; if ($a == $b) { echo '$a e $b são iguais'; } elseif ($a > $b) { echo '$a é maior que $b'; } else { echo '$a é menor que $b'; } -
While / Do-While <?php /* While */ $i = 1;
while ($i <= 10) { echo $i++; } /* Do-While */ $i = 1; do { echo $i++; } while ($i <= 10); -
For / Foreach <?php for ($i = 0; $i <=
100; $i++) { echo $i . PHP_EOL; } foreach (range(0, 100) as $numero) { echo $numero . PHP_EOL; } -
Foreach <?php for ($i = 0; $i <= 100; $i++)
{ echo $i . PHP_EOL; } foreach (range(0, 100) as $numero) { echo $numero . PHP_EOL; } -
Foreach <?php $clientes[3] = ['nome' => 'John Doe']; $clientes[2] =
['nome' => 'Steve Jobs']; $clientes[1] = ['nome' => 'Bill Gates']; foreach ($clientes as $chave => $cliente) echo "Cliente #{$chave}: {$cliente['nome']}" . PHP_EOL; /* Output: Cliente #3: John Doe Cliente #2: Steve Jobs Cliente #1: Bill Gates *****/ -
Foreach <?php $lista = array(50, 60, 70, 80); foreach ($lista
as $chave => $valor) echo "$chave: $valor" . PHP_EOL; /* Output: 0: 50 1: 60 2: 70 3: 80 *****/ -
Switch <?php $i = 1; switch ($i) { case 0:
echo 'primeira opção'; break; case 1: echo 'segunda opção'; break; case 2: echo 'terceira opção'; break; } -
Include / Require arquivo01.php <?php $texto = 'Trabalhando com o
Include no PHP'; function dobrar($numero) { return $numero * 2; } arquivo02.php <?php include 'arquivo01.php'; echo dobrar(4); // Output: 8 echo $texto; // Output: Trabalhando com o Include no PHP -
Include Exibe um “Warning” e não interrompe a execução Warning:
include(arquivo1.php): failed to open stream: No such file or directory in /Users/jweber/dev/projects/php/arquivo1.php on line 3 Warning: include(): Failed opening 'arquivo1.php' for inclusion (include_path='.:') in /Users/jweber/dev/projects/php/ arquivo1.php on line 3 Fatal error: Call to undefined function dobrar() in /Users/jweber/ dev/projects/php/arquivo2.php on line 5 -
Require Exibe um “Fatal Error” e interrompe a execução Warning:
require(arquivo1.php): failed to open stream: No such file or directory in /Users/jweber/dev/projects/php/ arquivo1.php on line 3 Fatal error: require(): Failed opening required 'arquivo1.php' (include_path='.:') in /Users/jweber/dev/ projects/php/arquivo1.php on line 3 -
FizzBuzz Neste problema, você deverá exibir uma lista de 1
a 100, um em cada linha, com as seguintes exceções: • Números divisíveis por 3 deve aparecer como 'Fizz' ao invés do número; • Números divisíveis por 5 devem aparecer como 'Buzz' ao invés do número; • Números divisíveis por 3 e 5 devem aparecer como 'FizzBuzz' ao invés do número'. -
Classe <?php class MinhaClasse { public $atributoPublico = 'Público'; protected
$atributoProtegido = 'Protegido'; private $atributoPrivado = 'Privado'; public function metodoQualquer() { echo $this->atributoPublico; echo $this->atributoProtegido; echo $this->atributoPrivado; } } $objeto = new MinhaClasse(); echo $objeto->atributoPublico; // OK echo $objeto->atributoProtegido; // Fatal Error echo $objeto->atributoPrivado; // Fatal Error $objeto->metodoQualquer(); // PúblicoProtegidoPrivado -
Construtor <?php class Pessoa { private $nome; private $sobrenome; public
function __construct($nome, $sobrenome) { $this->nome = $nome; $this->sobrenome = $sobrenome; } public function getNomeCompleto() { return $this->nome . ' ' . $this->sobrenome; } } $joao = new Pessoa('João', 'da Silva'); echo $joao->getNomeCompleto(); // João da Silva -
Destrutor <?php class Pessoa { private $nome, $sobrenome; public function
__construct($nome, $sobrenome) { $this->nome = $nome; $this->sobrenome = $sobrenome; } public function __destruct() { echo 'Destruindo...'; } } $joao = new Pessoa('João', 'da Silva'); unset($joao); //Destruindo... //$joao = null; //Destruindo... -
Método Estático <?php class MinhaClasse { function metodoNormal() { echo
'Método Normal'; } static function metodoEstatico() { echo 'Método Estático'; } } MinhaClasse::metodoNormal(); // Error MinhaClasse::metodoEstatico(); // OK $objeto = new MinhaClasse(); $objeto->metodoNormal(); $objeto->metodoEstatico(); -
Herança <?php class OutraClasse { public $atributo = 'Atributo Qualquer';
public function hello() { echo 'Hello World'; } } class MinhaClasse extends OutraClasse { public function getAtributo() { return $this->atributo; } } $objeto = new MinhaClasse(); $objeto->hello(); echo $objeto->getAtributo(); -
Classe Abstrata <?php abstract class OutraClasse { public $atributo =
'Atributo Qualquer'; public function hello() { echo 'Hello World'; } } class MinhaClasse extends OutraClasse { public function getAtributo() { return $this->atributo; } } $objeto2 = new OutraClasse(); // Fatal Error -
Método Abstrato <?php abstract class MinhaClasse { abstract function metodoAbstrato();
public function getAtributo() { return $this->atributo; } } $objeto = new MinhaClasse(); // Fatal Error -
Como utilizar o mesmo nome de classe em uma outra
biblioteca? Namespaces -
O que é Namespace? c:\arquivos\pasta01\foo.txt c:\arquivos\pasta02\foo.txt Assim, consigo ter arquivos
com os mesmos nomes, porém, em caminhos diferentes. -
62 Namespaces <?php namespace Escola\Publica; class Estudante { public $matricula,
$nome, $serie; function __construct($matricula, $nome, $serie) { $this->matricula = $matricula; $this->nome = $nome; $this->serie = $serie; } } -
63 Namespaces <?php namespace Escola\Privada; class Estudante { public $matricula,
$nome, $serie; function __construct($matricula, $nome, $serie) { $this->matricula = $matricula; $this->nome = $nome; $this->serie = $serie; } } -
64 Namespaces <?php require 'projeto/src/publica/Estudante.php'; $joao = new \Escola\Publica\Estudante(); require
'projeto/src/privada/Estudante.php'; $pedro = new \Escola\Privada\Estudante(); -
Namespaces <?php // PHP 5.3 and later: namespace Vendor\Model; class
Foo { } <?php // PHP 5.2.x and earlier: class Vendor_Model_Foo { } -
Namespaces <?php require 'projeto/src/publica/Estudante.php'; require 'projeto/src/privada/Estudante.php'; use \Escola\Publica\Estudante as EstudantePublica();
use \Escola\Privada\Estudante as EstudantePrivada(); $joao = new EstudantePublica(); $pedro = new EstudantePrivada(); -
Interfaces <?php interface NomeDaInterface { public function metodo($parametro); } interface
NomeDeOutraInterface { public function outroMetodo($param1, $param2); } class Qualquer implements NomeDaInterface, NomeDeOutraInterface { public function metodo($parametro) { print('Implementação...' . $parametro); } public function outroMetodo($param1, $param2) { print('Implementação 2...' . $param1 . $param2); } } $objeto = new Qualquer(); $objeto->metodo('Teste'); -
Constantes <?php namespace Vendor\Model; class Foo { const VERSION =
'1.0'; const DATE_APPROVED = '2012-06-01'; public function getVersion() { return self::VERSION; } } echo Foo::VERSION; -
Traits <?php trait Hello { function ola($nome) { echo "Olá,
{$nome}!"; } } class Pessoa { use Hello; } $joao = new Pessoa(); $joao->ola('Maria'); //Olá, Maria! -
DateTime <?php $input = '12. 30. 2014'; $data = \DateTime::createFromFormat('m.
d. Y', $input); echo 'Data no Padrão BR: ' . $data->format('d/m/Y'); -
DateTime <?php $input = '12. 30. 2014'; $dataInicial = \DateTime::createFromFormat('m.
d. Y', $input); $dataFinal = clone $dataInicial; $dataFinal->add(new \DateInterval('P4M23D')); // Adiciona 4 meses e 23 dias $diff = $dataFinal->diff($dataInicial); print('Diff: ' . $diff->format('%m meses, %d dias (total: %a dias)') . PHP_EOL); /* Output: Diff: 4 meses, 24 dias (total: 144 dias) **/ -
Autoload Simples <?php function __autoload($classe) { require $classe . '.php';
// require 'Pessoa.php'; } $pessoa = new Pessoa(); -
Try / Catch <?php function divisao($dividendo, $divisor) { if (0
=== $divisor) throw new \Exception('Divisão por zero!'); return $dividendo / $divisor; } try { $quociente = divisao(6, 0); // Fatal Error } catch (\Exception $ex) { printf("Error: %s", $ex->getMessage()); } finally { print('Finally sempre será executado...'); } -
Try / Catch <?php $email = new Fuel\Email; $email->subject('My Subject');
$email->body('How the heck are you?'); $email->to('[email protected]', 'Some Guy'); try { $email->send(); } catch(Fuel\Email\ValidationFailedException $e) { // The validation failed } catch(Fuel\Email\SendingFailedException $e) { // The driver could not send the email } finally { /* Executed regardless of whether an exception has been thrown, and before normal execution resumes */ } -
Test Driven Development (TDD) • Criado por Kent Beck em
1999 • Ciclo de desenvolvimento 1. Adicione um teste 2. Execute todos os testes e veja se algum deles falha 3. Escrever código 4. Execute os testes automatizados e veja-os executarem com sucesso 5. Refatorar código 6. Repita tudo