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” ?>

  2. +JonataWeber @jonataweber

  3. Agenda • Por que aprender PHP? • Principais Funcionalidades •

    PHP Básico e OO • Prática • Onde continuar estudando?
  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)
  5. Popularidade * Fonte: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html (01/03/2015)

  6. Maturidade • Criado em 1994 por Rasmus Lerdorf

  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)
  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
  9. Certificações

  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
  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)
  12. Principais Ferramentas • PHPUnit (TDD) e Behat (BDD) • Gerenciamento

    de Dependências (Composer e Pear) • XDebug e PHPDBG • PHPDoc
  13. Ok, chega de teoria e vamos praticar!

  14. 1º Passo Preparar o Ambiente

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

  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
  17. 2º Passo Criar o script PHP

  18. Bloco de Notas <?php echo ‘Hello World’; ?> Salvar na

    pasta “c:\php5x\www” como "hello.php"
  19. 3º Passo Executar o script PHP

  20. Inicializar o Servidor Web No console, acesse a pasta dos

    scripts php e depois digite: $ php -S localhost:8000
  21. Navegador Web Acessar: http://localhost:8000/index.php

  22. PHP Básico

  23. Tipos Primitivos • Boolean • Integer • Float • String

    • Array • NULL • Object
  24. Boolean <?php $variavel = true; $variavel = false; $variavel =

    (50 == '50'); // true $variavel = (50 != '50'); // false $variavel = (50 === '50'); // false $variavel = (50 !== '50'); // true
  25. 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)
  26. 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"';
  27. <?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
  28. <?php $variavel = 'Legal'; // Outputs: Variáveis funcionam assim: Legal

    echo “Variaveis funcionam assim: $variavel”; String Aspas Duplas
  29. Array <?php $array = array("foo", "bar", "hello", "world"); $array =

    ["foo", "bar", "hello", "world"]; // PHP >= 5.4
  30. 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", ];
  31. 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) }
  32. 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
  33. NULL <?php $variavel = NULL; $variavel = Null; $variavel =

    null;
  34. Constantes

  35. Funções <?php function helloWorld() { echo 'Hello World'; } helloWorld();

    // Hello World function maiusculo($texto) { return strtoupper($texto); } echo maiusculo('jonata weber'); // JONATA WEBER
  36. Funções Anônimas Lambda e Closure

  37. Operadores Aritméticos

  38. Operadores Lógicos

  39. PHP Básico  II

  40. 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'; }
  41. While / Do-While <?php /* While */ $i = 1;

    while ($i <= 10) { echo $i++; } /* Do-While */ $i = 1; do { echo $i++; } while ($i <= 10);
  42. For / Foreach <?php for ($i = 0; $i <=

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

    { echo $i . PHP_EOL; } foreach (range(0, 100) as $numero) { echo $numero . PHP_EOL; }
  44. 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 *****/
  45. 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 *****/
  46. 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; }
  47. 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
  48. 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
  49. 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
  50. Prática!

  51. 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'.
  52. 52 PHP Orientado a Objetos

  53. 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
  54. 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
  55. 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...
  56. 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();
  57. 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();
  58. 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
  59. Método Abstrato <?php abstract class MinhaClasse { abstract function metodoAbstrato();

    public function getAtributo() { return $this->atributo; } } $objeto = new MinhaClasse(); // Fatal Error
  60. Como utilizar o mesmo nome de classe em uma outra

    biblioteca? Namespaces
  61. 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. 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. 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. 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();
  65. Namespaces <?php // PHP 5.3 and later: namespace Vendor\Model; class

    Foo { } <?php // PHP 5.2.x and earlier: class Vendor_Model_Foo { }
  66. 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();
  67. 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');
  68. 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;
  69. Traits <?php trait Hello { function ola($nome) { echo "Olá,

    {$nome}!"; } } class Pessoa { use Hello; } $joao = new Pessoa(); $joao->ola('Maria'); //Olá, Maria!
  70. DateTime <?php $input = '12. 30. 2014'; $data = \DateTime::createFromFormat('m.

    d. Y', $input); echo 'Data no Padrão BR: ' . $data->format('d/m/Y');
  71. 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) **/
  72. Autoload Simples <?php function __autoload($classe) { require $classe . '.php';

    // require 'Pessoa.php'; } $pessoa = new Pessoa();
  73. 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...'); }
  74. SPL Exceptions http://php.net/manual/en/spl.exceptions.php

  75. SPL Exceptions <?php class ValidationFailedException extends Exception {}

  76. 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 */ }
  77. 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
  78. Onde Estudar? www.phptherightway.com

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

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

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

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

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

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

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