Fácil PHP

Criando e usando namespaces

Enunciado

Crie duas classes em namespaces diferentes: App\Models\Product e App\Services\ProductService. A classe Product deve ter um construtor que recebe $name e um método getName(). A classe ProductService deve ter um método describe(Product $product) que retorna "Produto: " . $product->getName(). No arquivo principal, instancie as duas e exiba o resultado.

Requisitos

  • A classe Product está no namespace App\Models.
  • A classe ProductService está no namespace App\Services.
  • O método describe recebe um Product e retorna a string formatada.
  • O arquivo principal usa use para importar as classes.

Código inicial

<?php
// Crie as classes nos namespaces corretos e use-as

Saída esperada

Produto: Notebook
Ver dica

Lembre-se de declarar namespace no topo de cada arquivo de classe e usar use no arquivo principal.

Mostrar solução
<?php
// Arquivo: Product.php
namespace App\Models;

class Product
{
    public function __construct(private string $name) {}

    public function getName(): string
    {
        return $this->name;
    }
}
<?php
// Arquivo: ProductService.php
namespace App\Services;

use App\Models\Product;

class ProductService
{
    public function describe(Product $product): string
    {
        return 'Produto: ' . $product->getName();
    }
}
<?php
// Arquivo principal
require 'Product.php';
require 'ProductService.php';

use App\Models\Product;
use App\Services\ProductService;

$product = new Product('Notebook');
$service = new ProductService();
echo $service->describe($product);

Passo a passo

  1. No arquivo Product.php, declaramos namespace App\Models; para agrupar a classe.
  2. A classe Product tem um construtor que promove $name a propriedade e um getter.
  3. No arquivo ProductService.php, declaramos namespace App\Services; e importamos Product com use.
  4. O método describe recebe um Product e monta a string.
  5. No arquivo principal, incluímos manualmente os arquivos (já que não usamos autoload).
  6. Importamos as classes com use e instanciamos.
  7. Exibimos o resultado.

Por que funciona

Namespaces evitam colisões de nomes. O use permite referenciar classes de outros namespaces sem escrever o nome completo. Como não há autoload, precisamos incluir os arquivos com require.

Erros comuns

  • Esquecer o namespace no topo do arquivo: a classe fica no namespace global e o use não funciona.
  • Usar use antes de require: o use é apenas um alias em tempo de compilação, mas a classe precisa existir quando instanciada.
  • Escrever o namespace com barras invertidas duplicadas: namespace App\\Models; está errado; use namespace App\Models;.

Outra forma de resolver

Se usar Composer, basta configurar o autoload PSR-4 e não precisa de require manual:

{
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  }
}

Saída esperada

Produto: Notebook