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
Productestá no namespaceApp\Models. - A classe
ProductServiceestá no namespaceApp\Services. - O método
describerecebe umProducte retorna a string formatada. - O arquivo principal usa
usepara 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
- No arquivo
Product.php, declaramosnamespace App\Models;para agrupar a classe. - A classe
Producttem um construtor que promove$namea propriedade e um getter. - No arquivo
ProductService.php, declaramosnamespace App\Services;e importamosProductcomuse. - O método
describerecebe umProducte monta a string. - No arquivo principal, incluímos manualmente os arquivos (já que não usamos autoload).
- Importamos as classes com
usee instanciamos. - 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
namespaceno topo do arquivo: a classe fica no namespace global e ousenão funciona. - Usar
useantes derequire: ouseé 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; usenamespace 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