Recentemente lancei um post Como usar Traits no PHP, com isso surgiu uma duvida nos comentários realizado pelo Paulo Dias, onde questionou como poderia utilizar a mesma implementação porem fazendo uso de namespace.

Neste post vou implementar o mesmo conceito do post anterior demonstrando o uso de namespace.

Para nossa implementação devemos criar o diretório com o nome ‘traits_com_namespace’, após sua criação devemos acessar a raiz do diretório pelo terminal e executar o seguinte comando:

1
composer init

Como observado acima, iremos utilizar o composer para que o mesmo faça o autoload do nosso projeto. Caso não conheça o composer recomendo a leitura do meu post Iniciando com composer.

Ao executar o comando, basta seguir o passo a passo solicitado pelo composer e gerar o arquivo composer.json.

Após  a finalização, abra o arquivo composer.json e vamos incluir nossa regra para autoload, veja o trecho de código abaixo.

1
2
3
4
5
"autoload": {
    "psr-4":{
        "DiegoBrocanelli\\":"src//"
    }
}

Devemos incluir o trecho de código no arquivo composer.json após a chave ‘minimum-stability’, como demonstrado abaixo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
    "name": "diego-brocanelli/traits-autoloader",
    "description": "Traits com autoloader",
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Diego Brocanelli",
            "email": "diegod2@msn.com"
        }
    ],
    "minimum-stability": "dev",
    "autoload": {
        "psr-4":{
            "DiegoBrocanelli\\":"src//"
        }
    }
}

Vamos detalhar o que configuramos de autoload:

  • Estamos utilizando PSR-4 e definimos que nossa namespace iniciará com ‘DiegoBrocanelli’  e nosso código ficará dentro do diretório src.

Para que nosso autoload seja gerado devemos executar o seguinte comando pelo terminal:

1
composer dumpautoload

Ao finalizar a geranção do autoload será criado o diretório vnedor e teremos o seguinte retorno no terminal.

1
Generating autoload files

Devemos agora criar nossa estrutura de código, uma boa pratica é separar nossos códigos com isso vamos criar um diretório App dentro de src.

Podemos agora criar a classe ShopCar.php dentro do diretório App e importar a implementação do post anterior, veja como ficou a implementação abaixo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php 
 
namespace DiegoBrocanelli\App;

/**
 * @author Diego Brocanelli <diegod2@msn.com>
 */
class ShopCar
{
    /**
     * Buy product
     */
    public function Buy()
    {
        return "Product purchase finish...";
    }
}

A implementação acima está 99.9% idêntica ao post anterior, porem, se repararmos na linha 3 foi definido a namespace, onde seguiu conforme configurações anteriores definindo a raiz DiegoBrocanelli seguido do diretório onde a classe encontra-se.

Vamos agora implementar nossa trait LogTrait.php dentro do diretório APP, veja abaixo a implementação.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php 
 
namespace DiegoBrocanelli\App;

/**
 * @author Diego Brocanelli <diegod2@msn.com>
 */
trait LogTrait
{
    /**
     * Log info.
     * 
     * @return string
     */
    public function info()
    {
        return 'Included a new log...';
    }
}

Novamente o código acima está 99.9% idêntico ao do post original, porem, na linha 03 definimos a namespace da nossa trait. Que como encontra-se no mesmo diretório da classe ShopCar mantém-se o mesmo.

Por fim, devemos atualizar nossa classe ShopCar para consumir nossa trait, veja implementação abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php 
 
namespace DiegoBrocanelli\App;

/**
 * @author Diego Brocanelli <diegod2@msn.com>
 */
class ShopCar
{
    use LogTrait;

    /**
     * Buy product
     */
    public function Buy()
    {
        return "Product purchase finish... {$this->info()}";
    }
}

Viram como foi simples! Como ambos os códigos encontram-se na mesma namespace, apenas utilizamos o comando ‘use’ para chamar nossa trait e assim termos o  acesso ao método info().

Para validar nosso projeto vamos criar um arquivo index.php na raiz do projeto e implementar a chamada da classe ShopCar, veja resultado da implementação  abaixo:

1
2
3
4
5
6
7
8
9
<?php

require_once __DIR__.'/vendor/autoload.php';

use DiegoBrocanelli\App\ShopCar;
 
$shopCar = new ShopCar();
 
echo $shopCar->buy();

Podemos observar, logo no início do arquivo importamos o autoload do composer, para temos acesso as nossas classes.

Em seguida importamos a classe ShopCar, utilizando o comando ‘use’.

A partir deste momento podemos instanciar a classe ShopCar  e acessar o método buy().

Abra o terminal e acesse a raiz do projeto e execute o seguinte comando:

1
php -S localhost:8080 index.php

Abra seu navegador e acesse a url:

1
localhost:8080

Como resultado, devemos obter o mesmo resultado obtido no post anterior, veja abaixo o retorno esperado.

1
Product purchase finish... Included a new log...

Com isso finalizamos nossa implementação. De forma simples e prática implementamos o mesmo conceito utilizando namespaces.

Foi uma implementação sem uso de framework, porem, o conceito de namespace é aplicado em todos os frameworks do ecossistema PHP.

Espero que este conteúdo tenha sanado a dúvida do nosso amigo Paulo Dias e todos que possam vir a utilizar e estão com dúvidas.

Caso você tenha alguma dúvida faça como o Paulo, deixe nos comentários, com isso podemos ir gerando cada vez mais conteúdo com um debate saudável, ficarei muito feliz em poder ajudar na medida do possível.

Grande abraço e até a próxima! 🙂