Namespace, Autoload e Autoload PSR-4

Como eu já ilustrei o uso do Composer na ultima publicação, gostaria agora de explicar o uso de alguns padrões novos do php e com isto preparar terreno pra que o leitor ao tentar desenvolver uma ferramenta usando um framework php tudo esteja mais claro e não tenha dificuldade de entender todos os conceitos e padrões do framework.

  1. Namespace
    Do que se trata?
    O mecanismo de namespace veio para organizar classes e métodos com um sistema de nomea-lo com algum complemento no nome da classe afim de tornar o nome da classe mais “incomum” e evitar conflitos com outras classes.
    Como funciona?
    Você definirá o namespace pra ser o “prefixo” da classe, pra que assim não aconteça confusão, por exemplo: PHPMAILER\config.php, desta forma o php não se confundirá com o config.php do seu sistema por exemplo.
    Veja como funciona:
    Arquivo index.php:

    include 'classe.php';
    echo \teste\Hello::exibir();

    Arquivo classe.php:

    namespace teste;
    class Hello {
    
    public function exibir() {
    
    return "olá mundo";
    
    }
    
    }
  2. Autoload evolução até o PSR-4

     

    Do que se trata?

    O autoload é um arquivo, preparado para carregar todas as classes e functions automaticamente. Se não me falha a memória, comecei a usa-lo no php 5 e salvo engano ele só veio valer aí mesmo no php 5 devido aos novos métodos mágicos, como o __construct, __autoload e etc (métodos mágicos), que possibilitaram esse novo mecanismo.

    Na prática:
    O meu método a uns 3 anos era o seguinte:

    /*
    * ARQUIVO site/autoload.php
    * Eu irei definir qual é a pasta do meu site no define DIRETORIO_BASE, e dentro desta pasta existirá uma
    * pasta chamada "classes", a primeira condição if(), vai me perguntar se existe algum documento com o nome
    * da da váriavel $classe que foi transmitida no método mágico __autoload, se existir ele vai dar um require
    * no arquivo dentro da pasta classes/
    
    */
    
    define("DIRETORIO_BASE", "site");
    
    function __autoload($classe)
    {
    if(file_exists($_SERVER["DOCUMENT_ROOT"] ."/". DIRETORIO_BASE . 'classes/' . $classe . '.php')):
    require_once($_SERVER["DOCUMENT_ROOT"] ."/". DIRETORIO_BASE . 'classes/' . $classe . '.php');
    else:
    exit('O arquivo ' . $file . ' não foi encontrado!' . $_SERVER["DOCUMENT_ROOT"] . "/". DIRETORIO_BASE . 'sistema/' . $classe . '.php');
    
    endif;
    }
    
    /*
    
    * ARQUIVO index.php
    * aqui no arquivo index, vamos chamar a classe que eu quiser.
    * apenas 3 linhas serão necessárias pra chamar a classe que você deseja
    
    */
    
    require 'site/autoload.php';
    
    $hello = new hello();
    
    echo $hello->helloworld();
    
    /*
    
    * ARQUIVO classes/hello.php
    * aqui no arquivo index, vamos chamar a classe que eu quiser.
    * apenas duas linhas serão necessárias pra chamar a classe que você deseja
    
    */
    
    class hello {
    
    public function helloworld() {
    
    return "olá mundo!";
    
    }
    
    }

    Enfim, me servia muito bem, entretanto com a ascensão do composer e a possibilidade de um sistema interagir com infinitos outros, isso me custou ter que aprender outro padrão de autoload, um padrão que comportasse também os namespaces, foi então que surgiu o PSR-4 junto com o composer. para incluir o PSR-4 no seu sistema você precisa fazer um arquivo composer.json com o seguinte código:

    /** OU SÓ ACRESCENTAR A PARTE DE AUTOLOAD **/
    
    {
    "name": "ramon/testenamespace",
    "authors": [
    {
    "name": "ramon",
    "email": "ramonsaldanhaa@gmail.com"
    }
    ],
    
    "autoload": {
    "psr-4": {
    "Classes\\" : "Classes"
    }
    },
    
    "require": {}
    
    }
Acessar seu console e executar o comando composer install, ou composer update (caso você não entenda essa parte, acesse este link), desta forma ele vai criar no seu arquivo de autoload do composer um outro autoload com padrão psr-4, pra desta forma você conseguir chamar todas as classes “namespaceadas” dentro da pasta “Classes”. por exemplo: Arquivo index.php

require 'vendor/autoload.php';
echo \Classes\Hello::exibir();

Arquivo Classes/Hello.php:

namespace Classes;
class Hello {

public function exibir() {

return "olá mundo";

}

}

Pronto, é isso! Uma sugestão: se aprofundar nunca é demais, tentei passar de forma didática e exemplificar o que é cada um dos mecanismos, para assim o próprio leitor procure se alimentar de todas documentações e informações que a internet fornece, nos próprios sites vocês encontrarão informações sobre esses sistemas.

http://php.net/manual/pt_BR/language.namespaces.php
http://www.php-fig.org/psr/psr-4/

2 de dezembro de 2016 por Ramon Saldanha