Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP: Começando do jeito certo!

PHP: Começando do jeito certo!

Jonata Weber

March 02, 2015
Tweet

More Decks by Jonata Weber

Other Decks in Programming

Transcript

  1. PHP
    Começando do jeito certo!
    = "Jonata Weber” ?>

    View full-size slide

  2. +JonataWeber
    @jonataweber

    View full-size slide

  3. Agenda
    • Por que aprender PHP?
    • Principais Funcionalidades
    • PHP Básico e OO
    • Prática
    • Onde continuar estudando?

    View full-size slide

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

    View full-size slide

  5. Popularidade
    * Fonte: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html (01/03/2015)

    View full-size slide

  6. Maturidade
    • Criado em 1994 por Rasmus Lerdorf

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. Certificações

    View full-size slide

  10. • 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

    View full-size slide

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

    View full-size slide

  12. Principais Ferramentas
    • PHPUnit (TDD) e Behat (BDD)
    • Gerenciamento de Dependências (Composer e
    Pear)
    • XDebug e PHPDBG
    • PHPDoc

    View full-size slide

  13. Ok, chega de teoria
    e vamos praticar!

    View full-size slide

  14. 1º Passo
    Preparar o Ambiente

    View full-size slide

  15. Performance x Versões
    (menor é melhor)

    View full-size slide

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

    View full-size slide

  17. 2º Passo
    Criar o script PHP

    View full-size slide

  18. Bloco de Notas

    Salvar na pasta “c:\php5x\www” como "hello.php"

    View full-size slide

  19. 3º Passo
    Executar o script PHP

    View full-size slide

  20. Inicializar o Servidor Web
    No console, acesse a pasta dos scripts php e depois digite:
    $ php -S localhost:8000

    View full-size slide

  21. Navegador Web
    Acessar:
    http://localhost:8000/index.php

    View full-size slide

  22. Tipos Primitivos
    • Boolean
    • Integer
    • Float
    • String
    • Array
    • NULL
    • Object

    View full-size slide

  23. Boolean
    $variavel = true;
    $variavel = false;
    $variavel = (50 == '50'); // true
    $variavel = (50 != '50'); // false
    $variavel = (50 === '50'); // false
    $variavel = (50 !== '50'); // true

    View full-size slide

  24. Integer e Float
    $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)

    View full-size slide

  25. String
    Aspas Simples
    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"';

    View full-size slide

  26. // 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

    View full-size slide

  27. $variavel = 'Legal';
    // Outputs: Variáveis funcionam assim: Legal
    echo “Variaveis funcionam assim: $variavel”;
    String
    Aspas Duplas

    View full-size slide

  28. Array
    $array = array("foo", "bar", "hello", "world");
    $array = ["foo", "bar", "hello", "world"]; // PHP >= 5.4

    View full-size slide

  29. Array
    Sintaxe:
    array(
    key => value,
    key2 => value2,
    key3 => value3,
    ...
    )
    $variavel = array(
    "chave1" => "valor1",
    "chave2" => "valor2",
    );
    // as of PHP 5.4
    $variavel = [
    "chave1" => "valor1",
    "chave2" => "valor2",
    ];

    View full-size slide

  30. Array
    $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)
    }

    View full-size slide

  31. Array
    $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

    View full-size slide

  32. NULL
    $variavel = NULL;
    $variavel = Null;
    $variavel = null;

    View full-size slide

  33. Funções
    function helloWorld() {
    echo 'Hello World';
    }
    helloWorld(); // Hello World
    function maiusculo($texto) {
    return strtoupper($texto);
    }
    echo maiusculo('jonata weber'); // JONATA WEBER

    View full-size slide

  34. Funções Anônimas
    Lambda e Closure

    View full-size slide

  35. Operadores Aritméticos

    View full-size slide

  36. Operadores Lógicos

    View full-size slide

  37. PHP
    Básico  II

    View full-size slide

  38. IF / ELSEIF / ELSE
    $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';
    }

    View full-size slide

  39. While / Do-While
    /* While */
    $i = 1;
    while ($i <= 10) {
    echo $i++;
    }
    /* Do-While */
    $i = 1;
    do {
    echo $i++;
    } while ($i <= 10);

    View full-size slide

  40. For / Foreach
    for ($i = 0; $i <= 100; $i++) {
    echo $i . PHP_EOL;
    }
    foreach (range(0, 100) as $numero) {
    echo $numero . PHP_EOL;
    }

    View full-size slide

  41. Foreach
    for ($i = 0; $i <= 100; $i++) {
    echo $i . PHP_EOL;
    }
    foreach (range(0, 100) as $numero) {
    echo $numero . PHP_EOL;
    }

    View full-size slide

  42. Foreach
    $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
    *****/

    View full-size slide

  43. Foreach
    $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
    *****/

    View full-size slide

  44. Switch
    $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;
    }

    View full-size slide

  45. Include / Require
    arquivo01.php
    $texto = 'Trabalhando com o Include no PHP';
    function dobrar($numero) {
    return $numero * 2;
    }
    arquivo02.php
    include 'arquivo01.php';
    echo dobrar(4); // Output: 8
    echo $texto; // Output: Trabalhando com o Include no PHP

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  48. 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'.

    View full-size slide

  49. 52
    PHP
    Orientado a Objetos

    View full-size slide

  50. Classe
    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

    View full-size slide

  51. Construtor
    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

    View full-size slide

  52. Destrutor
    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...

    View full-size slide

  53. Método Estático
    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();

    View full-size slide

  54. Herança
    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();

    View full-size slide

  55. Classe Abstrata
    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

    View full-size slide

  56. Método Abstrato
    abstract class MinhaClasse
    {
    abstract function metodoAbstrato();
    public function getAtributo()
    { return $this->atributo;
    }
    }
    $objeto = new MinhaClasse(); // Fatal Error

    View full-size slide

  57. Como utilizar o mesmo
    nome de classe em uma
    outra biblioteca?
    Namespaces

    View full-size slide

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

    View full-size slide

  59. 62
    Namespaces
    namespace Escola\Publica;
    class Estudante
    {
    public $matricula, $nome, $serie;
    function __construct($matricula, $nome, $serie)
    {
    $this->matricula = $matricula;
    $this->nome = $nome;
    $this->serie = $serie;
    }
    }

    View full-size slide

  60. 63
    Namespaces
    namespace Escola\Privada;
    class Estudante
    {
    public $matricula, $nome, $serie;
    function __construct($matricula, $nome, $serie)
    {
    $this->matricula = $matricula;
    $this->nome = $nome;
    $this->serie = $serie;
    }
    }

    View full-size slide

  61. 64
    Namespaces
    require 'projeto/src/publica/Estudante.php';
    $joao = new \Escola\Publica\Estudante();
    require 'projeto/src/privada/Estudante.php';
    $pedro = new \Escola\Privada\Estudante();

    View full-size slide

  62. Namespaces
    // PHP 5.3 and later:
    namespace Vendor\Model;
    class Foo
    {
    }
    // PHP 5.2.x and earlier:
    class Vendor_Model_Foo
    {
    }

    View full-size slide

  63. Namespaces
    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();

    View full-size slide

  64. Interfaces
    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');

    View full-size slide

  65. Constantes
    namespace Vendor\Model;
    class Foo
    {
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
    public function getVersion()
    { return self::VERSION;
    }
    }
    echo Foo::VERSION;

    View full-size slide

  66. Traits
    trait Hello
    {
    function ola($nome)
    { echo "Olá, {$nome}!";
    }
    }
    class Pessoa
    {
    use Hello;
    }
    $joao = new Pessoa();
    $joao->ola('Maria'); //Olá, Maria!

    View full-size slide

  67. DateTime
    $input = '12. 30. 2014';
    $data = \DateTime::createFromFormat('m. d. Y', $input);
    echo 'Data no Padrão BR: ' . $data->format('d/m/Y');

    View full-size slide

  68. DateTime
    $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)
    **/

    View full-size slide

  69. Autoload
    Simples
    function __autoload($classe)
    {
    require $classe . '.php'; // require 'Pessoa.php';
    }
    $pessoa = new Pessoa();

    View full-size slide

  70. Try / Catch
    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...');
    }

    View full-size slide

  71. SPL Exceptions
    http://php.net/manual/en/spl.exceptions.php

    View full-size slide

  72. SPL Exceptions
    class ValidationFailedException extends Exception {}

    View full-size slide

  73. Try / Catch
    $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 */
    }

    View full-size slide

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

    View full-size slide

  75. Onde Estudar?
    www.phptherightway.com

    View full-size slide

  76. Onde Estudar?
    www.php.net/docs.php

    View full-size slide

  77. Onde Estudar?
    www.php.net/docs.php

    View full-size slide

  78. Onde Estudar?
    http://www.codecademy.com/tracks/php

    View full-size slide

  79. Onde Estudar?
    http://www.w3schools.com/html/html_intro.asp

    View full-size slide

  80. Onde Estudar?
    http://www.codecademy.com/tracks/web

    View full-size slide

  81. Onde Estudar?
    http://www.w3c.br/Cursos/CursoHTML5

    View full-size slide

  82. https://github.com/jonataa/php-siecomp-2015
    [email protected]
    Obrigado!

    View full-size slide