Menu
Coddy logo textTech

Introdução a Namespaces

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 10 de 91.

À medida que seus projetos PHP crescem, você criará muitas classes. O que acontece quando duas classes têm o mesmo nome?

Por exemplo, você pode ter uma classe User para o seu blog e outra classe User para a sua loja. Namespaces resolvem esse problema organizando classes em grupos lógicos.

Um namespace é como uma pasta para suas classes. Você o declara no topo do seu arquivo PHP usando a palavra-chave namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Agora você pode ter outra classe User em um namespace diferente:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

Para usar uma classe com namespace, você a referencia com seu caminho completo usando uma barra invertida:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

Saída:

Alice
alice@example.com

A barra invertida \ separa níveis de namespace, de forma semelhante a como as barras separam pastas em um caminho de arquivo. Você também pode criar namespaces aninhados como App\Models\Blog para uma organização mais profunda.

Ponto Chave: Namespaces evitam conflitos de nomes e mantêm seu código organizado. Sempre declare o namespace antes de qualquer outro código em seu arquivo (exceto por instruções declare).

challenge icon

Desafio

Fácil

Vamos organizar uma pequena aplicação usando namespaces para evitar conflitos de nomes entre classes com o mesmo nome.

Imagine que você está construindo um sistema que lida tanto com veículos quanto com animais. Ambos os domínios possuem uma entidade chamada Car — uma representa um automóvel real, enquanto a outra é um gato de estimação chamado "Car" (sim, algumas pessoas dão esse nome aos seus gatos!).

Você criará três arquivos:

  • Vehicle/Car.php — Defina uma classe Car no namespace Vehicle com uma propriedade public $brand. O construtor deve aceitar o nome da marca e defini-lo. Adicione um método describe() que retorna "Vehicle: [brand]".
  • Animal/Car.php — Defina uma classe Car no namespace Animal (este é um gato chamado Car!). Ela deve ter uma propriedade public $age. O construtor aceita a idade e a define. Adicione um método describe() que retorna "Cat named Car, age: [age]".
  • main.php — Inclua ambos os arquivos de classe usando require_once. Crie um objeto de cada namespace usando seus caminhos de namespace completos e, em seguida, imprima o resultado da chamada de describe() em cada objeto (cada um em sua própria linha).

Em main.php, crie:

  • Um Vehicle\Car com a marca "Toyota"
  • Um Animal\Car com a idade 3

Lembre-se de usar a barra invertida \ para referenciar classes com namespace usando seu caminho completo ao criar objetos.

Folha de consulta

Namespaces organizam classes em grupos lógicos e evitam conflitos de nomes quando várias classes compartilham o mesmo nome.

Declare um namespace no topo de um arquivo PHP usando a palavra-chave namespace:

<?php
namespace Blog;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Você pode ter classes com o mesmo nome em namespaces diferentes:

<?php
namespace Shop;

class User {
    public $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

Para usar uma classe com namespace, referencie-a com seu caminho completo usando uma barra invertida \:

<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");

echo $blogUser->name . "\n";
echo $shopUser->email . "\n";

A barra invertida separa os níveis de namespace, de forma semelhante aos caminhos de pastas. Você pode criar namespaces aninhados como App\Models\Blog.

Importante: Sempre declare o namespace antes de qualquer outro código em seu arquivo (exceto instruções declare).

Experimente você mesmo

<?php
// Incluir os arquivos de classe
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';

// TODO: Criar um objeto Vehicle\Car com a marca "Toyota"
// Lembre-se de usar o caminho completo do namespace com barra invertida

// TODO: Criar um objeto Animal\Car com idade 3
// Lembre-se de usar o caminho completo do namespace com barra invertida

// TODO: Imprimir o resultado de describe() para cada objeto (cada um em sua própria linha)

?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos