Como nomear arquivos de classes com namespace?

8

WP Core Handbook > Padrões de codificação PHP > Convenções de Nomenclatura sugere o seguinte para nomear arquivos com classes:

  

Os nomes dos arquivos de classe devem ser baseados no nome da classe com class-   prepended e os sublinhados no nome da classe substituído por hífens,   por exemplo, WP_Error se torna:

class-wp-error.php

Embora a partir da redação da seção seja destinada principalmente ao uso do core , o estilo de codificação geralmente faz (e deve, na minha opinião) se aplicar ao código WP de terceiros.

No entanto, como o core não suporta namespaces (PHP 5.2, ugh) isso não leva em conta esse caso.

Qual é o caminho prático a seguir nas perspectivas de conveniência do desenvolvedor? Suporte de autocarregadores?

Eu pude ver várias formas alternativas:

  • ignorando completamente o namespace
  • incluindo espaço para nome no nome do arquivo
  • usando namespaces como níveis de pasta
  • usando esquema de nomenclatura alternativo, como PSR
por Rarst 27.10.2014 / 12:15

4 respostas

6

Primeiro, ignore o prefixo class- . Isso vem da abordagem de código processual puro do WordPress, as classes são usadas como contêineres para código procedural, não para objetos reais e a maioria dos arquivos não contém classes ou classes e outros códigos juntos. Não faz sentido quando todos os seus arquivos contêm apenas uma classe e nada mais. Se você seguisse esse padrão, teria de usar interface-foo.php e trait-bar.php . Isso não parece ridículo, torna o carregamento automático mais difícil do que o necessário.

A maneira mais fácil de separar namespaces e nomes de classes / interfaces / características é (pela minha experiência) atribuir namespaces a nomes de diretórios e nomes de classes a nomes de arquivos. Isso torna muito fácil mapear a classe solicitada para uma determinada estrutura de arquivos no carregador automático: basta converter \ para / , anexar .php e carregar o arquivo.

Isso também facilita o armazenamento em cache das pesquisas: para cada diretório / namespace, é possível buscar todos os arquivos existentes na primeira vez que o diretório é solicitado e, para chamadas posteriores, você pode reutilizar essa lista sem perguntar para file_exists() de cada vez.

    
por fuxia 27.10.2014 / 13:06
1

Geralmente, vou com a segunda metade de suas opções:

  
  • usando namespaces como níveis de pasta
  •   
  • usando esquema de nomenclatura alternativo, como PSR
  •   

Se você usar o compositor para registrar um autoloader do PSR-4, poderá ficar próximo das convenções de nomenclatura do WP. Namespaces mapeados para pastas que podem conter sublinhados com arquivos nomeados como a classe, que também podem conter sublinhados. Como:

<Namespace_Dir>/Class_Name.php

Quando o WP passa para o php 5.3+ (tem que acontecer eventualmente, certo ?!) as diretrizes precisam ser atualizadas. Como o PSR-0 já está obsoleto, o PSR-4 deve ser pelo menos recomendado, se não for necessário.

    
por cfoellmann 27.10.2014 / 14:06
1

Eu fiz uma aula para esse requisito, compatível com o PSR-4 e seguindo os padrões de codificação do Wordpress.

Você pode acessá-lo aqui: enlace

A explicação está toda lá, mas basicamente é uma dependência do compositor. Você só precisa exigir isso em seu projeto:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

E depois ligue para a turma

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
    
por Pablo S G Pacheco 17.02.2017 / 01:24
0

A solução de pablo-s-g-pacheco funcionou para mim, o autoloading depende do compositor e ainda é compatível com os padrões de codificação do WordPress, no entanto a URL do repositório do Github é:

enlace

e o nome do pacote é:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Finalmente, você também precisará adicionar o seguinte ao seu composer.json porque o pacote não está disponível no packagist:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
    
por guillaume.molter 31.07.2018 / 15:22