Padrões de Codificação PHP
Padrões PHP
Seção intitulada “Padrões PHP”XOOPS segue padrões de codificação PSR-1, PSR-4 e PSR-12 com convenções específicas do XOOPS.
Visão Geral de Padrões
Seção intitulada “Visão Geral de Padrões”graph TB subgraph "Padrões PSR" A[PSR-1: Codificação Básica] B[PSR-4: Autocarregamento] C[PSR-12: Estilo Estendido] end
subgraph "Convenções XOOPS" D[Padrões de Nomenclatura] E[Organização de Arquivo] F[Documentação] end
A --> G[Código Limpo] B --> G C --> G D --> G E --> G F --> GEstrutura de Arquivo
Seção intitulada “Estrutura de Arquivo”Tags PHP
Seção intitulada “Tags PHP”<?php// Sempre use tags PHP completas, nunca tags curtas// Omita tag de fechamento ?> em arquivos PHP puros
declare(strict_types=1);
namespace XoopsModules\MyModule;
// Código aqui...Cabeçalho de Arquivo
Seção intitulada “Cabeçalho de Arquivo”<?php
declare(strict_types=1);
/** * XOOPS - PHP Content Management System * * @package XoopsModules\MyModule * @subpackage Class * @author Seu Nome <email@example.com> * @copyright 2026 Projeto XOOPS * @license GPL-2.0-or-later * @link https://xoops.org */
namespace XoopsModules\MyModule;
use XoopsObject;use XoopsPersistableObjectHandler;Convenções de Nomenclatura
Seção intitulada “Convenções de Nomenclatura”Classes
Seção intitulada “Classes”// PascalCase para nomes de classeclass ItemHandler extends XoopsPersistableObjectHandler{ // ...}
// Interfaces terminam com "Interface"interface RepositoryInterface{ public function find(int $id): ?object;}
// Traits terminam com "Trait"trait TimestampTrait{ public function getCreatedAt(): \DateTimeInterface { // ... }}
// Classes abstratas prefixam com "Abstract"abstract class AbstractEntity{ // ...}Métodos e Funções
Seção intitulada “Métodos e Funções”// camelCase para métodospublic function getActiveItems(): array{ // ...}
// Verbos para métodos de açãopublic function createItem(array $data): Itempublic function updateItem(int $id, array $data): boolpublic function deleteItem(int $id): boolpublic function findById(int $id): ?Itempublic function hasPermission(string $permission): boolpublic function isActive(): boolpublic function canEdit(): boolVariáveis e Propriedades
Seção intitulada “Variáveis e Propriedades”class Item{ // camelCase para propriedades private int $itemId; private string $itemTitle; private bool $isPublished; private array $categoryIds;
// camelCase para variáveis public function process(): void { $itemCount = 0; $activeItems = []; $isValid = true; }}Constantes
Seção intitulada “Constantes”// UPPER_SNAKE_CASE para constantesclass Config{ public const DEFAULT_ITEMS_PER_PAGE = 10; public const MAX_UPLOAD_SIZE = 10485760; public const CACHE_LIFETIME = 3600;}
// Ou em chamadas define()define('XOOPS_ROOT_PATH', '/path/to/xoops');define('MYMODULE_VERSION', '1.0.0');Estrutura de Classe
Seção intitulada “Estrutura de Classe”<?php
declare(strict_types=1);
namespace XoopsModules\MyModule;
use XoopsDatabase;use XoopsPersistableObjectHandler;
/** * Manipulador para objetos Item * * @package XoopsModules\MyModule */class ItemHandler extends XoopsPersistableObjectHandler{ // 1. Constantes public const TABLE_NAME = 'mymodule_items';
// 2. Propriedades (ordem de visibilidade: public, protected, private) public int $defaultLimit = 10;
protected string $table;
private XoopsDatabase $db;
// 3. Construtor public function __construct(?XoopsDatabase $db = null) { $this->db = $db ?? \XoopsDatabaseFactory::getDatabaseConnection(); parent::__construct($this->db, self::TABLE_NAME, Item::class, 'id', 'title'); }
// 4. Métodos públicos public function getPublishedItems(int $limit = 10): array { $criteria = new \CriteriaCompo(); $criteria->add(new \Criteria('status', 'published')); $criteria->setLimit($limit);
return $this->getObjects($criteria); }
public function findBySlug(string $slug): ?Item { $criteria = new \Criteria('slug', $slug); $items = $this->getObjects($criteria);
return $items[0] ?? null; }
// 5. Métodos protegidos protected function validateItem(Item $item): bool { // Lógica de validação return true; }
// 6. Métodos privados private function sanitizeInput(string $input): string { return htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); }}Regras de Formatação
Seção intitulada “Regras de Formatação”Indentação e Espaçamento
Seção intitulada “Indentação e Espaçamento”// Use 4 espaços para indentação (não tabs)class Example{ public function method(): void { if ($condition) { // 4 espaços foreach ($items as $item) { // 8 espaços $this->process($item); } } }}
// Uma linha em branco entre métodospublic function methodOne(): void{ // ...}
public function methodTwo(): void{ // ...}
// Sem espaço em branco no final// Arquivos terminam com uma nova linha únicaComprimento de Linha
Seção intitulada “Comprimento de Linha”// Máximo 120 caracteres por linha// Quebre linhas logicamente
// Chamadas de método longas$result = $this->someHandler->processComplexOperation( $parameter1, $parameter2, $parameter3, $parameter4);
// Arrays longas$config = [ 'option1' => 'value1', 'option2' => 'value2', 'option3' => 'value3',];
// Condições longasif ($condition1 && $condition2 && $condition3) { // ...}Estruturas de Controle
Seção intitulada “Estruturas de Controle”if ($condition) { // código} elseif ($otherCondition) { // código} else { // código}
// switchswitch ($value) { case 1: doSomething(); break;
case 2: doSomethingElse(); break;
default: doDefault(); break;}
// try/catchtry { $result = $this->riskyOperation();} catch (SpecificException $e) { $this->handleSpecific($e);} catch (\Exception $e) { $this->handleGeneral($e);} finally { $this->cleanup();}
// foreachforeach ($items as $key => $value) { // código}
// forfor ($i = 0; $i < $count; $i++) { // código}Declarações de Tipo
Seção intitulada “Declarações de Tipo”<?php
declare(strict_types=1);
class TypeExample{ // Tipos de propriedade (PHP 7.4+) private int $id; private string $title; private ?string $description = null; private array $tags = []; private bool $isActive = false;
// Construtor com parâmetros tipados public function __construct( int $id, string $title, ?string $description = null ) { $this->id = $id; $this->title = $title; $this->description = $description; }
// Declarações de tipo de retorno public function getId(): int { return $this->id; }
public function getTitle(): string { return $this->title; }
// Tipo de retorno anulável public function getDescription(): ?string { return $this->description; }
// Tipos union (PHP 8.0+) public function getValue(): int|string { return $this->value; }
// Tipo de retorno void public function setTitle(string $title): void { $this->title = $title; }
// Array de retorno com docblock para conteúdo /** * @return Item[] */ public function getItems(): array { return $this->items; }}Documentação
Seção intitulada “Documentação”DocBlock de Classe
Seção intitulada “DocBlock de Classe”/** * Manipula operações CRUD para entidades Article * * Este manipulador fornece métodos para criar, ler, atualizar, * e deletar artigos no banco de dados. * * @package XoopsModules\Publisher * @subpackage Handler * @author Equipe de Desenvolvimento XOOPS * @since 1.0.0 */class ArticleHandler extends XoopsPersistableObjectHandler{DocBlock de Método
Seção intitulada “DocBlock de Método”/** * Recuperar artigos por categoria * * Obtém artigos publicados pertencentes a uma categoria específica, * ordenados por data de criação descendente. * * @param int $categoryId ID de categoria * @param int $limit Máximo de artigos para retornar * @param int $offset Offset inicial para paginação * @param bool $published Apenas retornar artigos publicados * * @return Article[] Array de objetos Article * * @throws \InvalidArgumentException Se ID de categoria for inválido * * @since 1.0.0 */public function getByCategory( int $categoryId, int $limit = 10, int $offset = 0, bool $published = true): array {Configuração de Ferramentas
Seção intitulada “Configuração de Ferramentas”PHP CS Fixer
Seção intitulada “PHP CS Fixer”<?php
$finder = PhpCsFixer\Finder::create() ->in(__DIR__ . '/class') ->in(__DIR__ . '/src');
return (new PhpCsFixer\Config()) ->setRules([ '@PSR12' => true, 'array_syntax' => ['syntax' => 'short'], 'ordered_imports' => ['sort_algorithm' => 'alpha'], 'no_unused_imports' => true, 'declare_strict_types' => true, ]) ->setFinder($finder);PHPStan
Seção intitulada “PHPStan”# phpstan.neonparameters: level: 6 paths: - class/ - src/ ignoreErrors: - '#Call to an undefined method XoopsObject::#'Documentação Relacionada
Seção intitulada “Documentação Relacionada”- Padrões JavaScript
- Organização de Código
- Diretrizes de Pull Request
#xoops #php #coding-standards #psr #best-practices