Skip to content

Instantly share code, notes, and snippets.

@alganet
Created November 24, 2012 03:19
Show Gist options
  • Save alganet/4138224 to your computer and use it in GitHub Desktop.
Save alganet/4138224 to your computer and use it in GitHub Desktop.
PHP Eficiente

PHP Eficiente

Um hbook para qualquer programador.

Rascunho, links provavelmente estão quebrados.

Olá Mundo!

Que forma mais eficiente de começar senão um guia rápido de como fazer o Hello World mais simples que você imaginar?

Se você é um iniciante corajoso, prepare-se para pesquisar e ler bastante. Colocarei links indicando o caminho sempre que necessário!

Certifique-se de ter a última versão do PHP funcionando legal na sua linha de comando de qualquer sistema operacional desktop e vamos começar.

Crie uma pasta qualquer no seu sistema e nela crie um arquivo index.php contendo apenas a frase "Olá Alexandre" (troque pelo seu nome!) e, estando naquela pasta pelo terminal, rode php -S localhost:8066. Ao acessar http://localhost:8066 no navegador, você verá seu nome na tela. Coloque <!doctype html>Olá Alexandre para impressionar seus amigos com um Hello World válido em HTML5 :P

Esse exemplo, o menor Hello World web do mundo, funciona assim: Ao rodar php -S localhost:alguma_porta você, através da opção -S, pediu pro PHP subir um servidor na pasta atual. Esse servidor existe desde a versão 5.4, antes você poderia utilizar o Apache que é simples de instalar em qualquer lugar.

Servidores web ligam várias linguagens de programação utilizando protocolos derivados do CGI à internet. O Apache é robusto e serve para publicar sistemas na web. O -S do PHP é pra testes locais e simples. Eles são acessados sempre por um IP e uma porta, geralmente a padrão 80. Quando a porta publicada não é padrão, usamos :numero_da_porta naquela parte da URL. Lembre-se que localhost sempre aponta para o IP 127.0.0.1.

Quando a requisição chega no PHP, ele executa o nome como se fosse <?php echo 'Olá Alexandre';. Tudo que não estava entre tags PHP agia como um echo.

Olá Web!

O que é o PHP senão a primeira e mais popular linguagem criada para desenvolvedores web? Estando na web, o caminho é sempre seguir a modinha tão bem a ponto de aprimorá-la e extrair o melhor das tendências.

Como no dia-a-dia vemos muitas tendências recentes e também muitas tendências de 5 ou 10 anos atrás, cobriremos rapidamente aquelas que dominaram o mercado PHP na última década, com um esforço ininterrupto para tornar esse conhecimento novo e atual.

Bancos de Dados Relacionais

Esses dominam o software e a web há muito tempo, com devido mérito! SQL é imbatível para o que foi proposto: armazenar e consultar dados que possuem relacionamentos entre si de forma segura.

Esqueça tudo que você conhece sobre bancos de dados no PHP que não for relacionado com a PDO. Se você não conhece a PDO, explicaremos ela aqui:

PHP Data Object é o cara pra mexer com bancos de dados. Consulte php.net/pdo para o suporte a diferentes drivers. Com certeza o MySQL, SQLite e PostgreSQL tem um bom suporte.

Ao contrário da web que possui comunicação uniforme via HTTP, e você deveria agradecer por isso, os bancos de dados comunicam-se por sockets de formas diferentes, estranhas e sem sentido. É isso que a PDO abstrai. Até mesmo para conectar nessa salada não existe um padrão, e aí você precisa ficar atento.

Lembre-se sempre do MySQL e SQLite.

<?php //Estamos em um novo arquivo!

// MySQL
$connection = new PDO('mysql:host=my.db.host;dbname=mydb', 'myuser', 'mypass');

// ...ou SQLite com caminho de arquivo relativo ao diretório atual ou absoluto.
$connection = new PDO('sqlite:path_to_file.sq3');

// ...ou SQLite em memória. Use esse para prosseguir!
$connection = new PDO('sqlite::memory:');

Agora, se você precisa de um banco de dados que tem suporte medíocre pela PDO, consulte a documentação e resolva a parte não-pragmática e procure uma solução pronta que já abstraia esse problema, como o Doctrine.

Um pouco antes de usar essa $connection vamos aprender tudo que você precisa pra desenvolver usando qualquer banco de dados moderno: um pedaço do padrão SQL92. É o último que todos os bancos de dados respeitam.

// ...continuando
$connection->exec('
    CREATE TABLE author (
        id INT PRIMARY KEY,
        name VARCHAR(32) NOT NULL
    )
');

// ...coloque todos esses abaixo também no arquivo!
$connection->exec('
    CREATE TABLE article (
        id INT PRIMARY KEY,
        published DATETIME,
        title VARCHAR(32) NOT NULL,
        author_id INT NOT NULL REFERENCES author(id)
    )
');

$connection->exec('
    CREATE TABLE category (
        id INT PRIMARY KEY,
        name VARCHAR(32) NOT NULL
    )
');

$connection->exec('
    CREATE TABLE article_category (
        id INT PRIMARY_KEY,
        article_id INT NOT NULL REFERENCES article(id),
        category_id INT NOT NULL REFERENCES category(id),
        UNIQUE (article_id, category_id)
    )
');

O método $connection->exec() executa comandos diretamente no banco de dados. Se você não conhece orientação à objetos, prazer: $connection é um objeto que você instanciou (criou) com new PDO(... e exec() é um método (algo que esse objeto faz). OOP é basicamente isso, focada em organização de código.

Se você não sabe os comandos SQL acima, procure o manual do SQLite ou do MySQL e lembre-se: de tudo listado lá, a única coisa que funciona em praticamente todos os bancos de dados é o listado neste guia.

Abriremos uma única exceção: chaves que se auto-incrementam. Da moda dos bancos de dados, uma possível evolução talvez tenham sido os IDs em bancos de dados. A integração com sistemas, principalmente os orientados à objetos, torna-se mais simples com eles:

  • MySQL: id INT PRIMARY KEY AUTO_INCREMENT
  • SQLite: id INTEGER PRIMARY KEY

Crie sempre tabelas em inglês, no singular e use um padrão bem definido de nomes de chaves primárias, chaves estrangeiras e colunas que muitas tabelas possuem em comum. Se você não sabe como funcionam as chaves, estude esse importante assunto. Consulte o manual do banco que você usa. O padrão que usei acima é simples:

  • Toda tabela deve ter como primeiro campo uma chave primária chamada id, auto-incrementada.
  • Chaves estrangeiras deve ter seu nome composto do nome da tabela seguido de _id.
  • Tabelas N-para-N devem ter seu nome composto dos nomes das duas tabelas em ordem de importância separados por _.

Se você rodou esse arquivo, até agora, provavelmente não viu nada acontecer. Só estamos configurando a conexão e criando algumas tabelas, agora vamos inserir alguns dados:

@raphaeldealmeida
Copy link

Boa, material em português de qualidade é difícil de encontrar. Só de acessar o banco com PDO é um avanço.
Se tivesse um sumário eu podeira ajudar.

@ars-dev-br
Copy link

Já existe uma tradução em português do phptherightway.com? Eu topo colaborar se ainda não houver e vocês quiserem se organizar para isso.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment