Como nomear arquivos de classes com namespace?

9

Manual do WP Core> 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 se basear no nome da classe com class- prefixo e os sublinhados no nome da classe substituídos por hífens, por exemplo WP_Error:

class-wp-error.php

Embora o texto da seção seja destinado principalmente ao uso principal , o estilo de codificação geralmente se aplica (e deve, na minha opinião) ao código WP de terceiros.

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

Qual é o caminho prático a seguir, na perspectiva da conveniência do desenvolvedor? Suporte de carregadores automáticos?

Eu pude ver várias maneiras alternativas:

  • ignorando completamente o espaço para nome
  • incluindo espaço para nome no nome do arquivo
  • usando namespaces como níveis de pasta
  • usando o esquema de nomeação alternativo, como PSR
Rarst
fonte
3
Minha opinião sincera é que, se você usa o PHP 5.3+, já está violando as regras principais do WP. Além disso, considere que os padrões WP não levam em consideração interfaces ou características. Então, para mim, faça sentido escolher uma maneira conveniente para você e usar um padrão já estabelecido, como o PSR, parece uma escolha melhor nesse caso.
gmazzap

Respostas:

7

Primeiro, ignore o class-prefixo. Isso vem da abordagem de código processual puro do WordPress, as classes são usadas como contêineres para código processual, 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 que usar interface-foo.phpe 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 classe / interface / característica é (pela minha experiência) atribuindo namespaces a nomes de diretório e nomes de classe a nomes de arquivos. Isto torna muito fácil para mapear a classe solicitada para uma determinada estrutura de arquivos na auto-loader: apenas converter \para /, anexar .phpe carregar o arquivo.

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

fuxia
fonte
4
Em outras palavras: Faça-PSR :) compatível
kaiser
2

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

Você pode acessá-lo aqui: https://github.com/pablo-pacheco/wp-namespace-autoloader

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

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

E depois chame a classe

<?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 
) );
Pablo SG Pacheco
fonte
1

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

  • usando namespaces como níveis de pasta
  • usando o esquema de nomeação alternativo, como PSR

Se você usar o compositor para registrar um carregador automático PSR-4, poderá ficar perto das convenções de nomenclatura do WP. Espaços para nome mapeados para pastas que podem conter sublinhados com arquivos nomeados como a classe que também podem conter sublinhados. Gostar:

<Namespace_Dir>/Class_Name.php

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

cfoellmann
fonte
0

A solução de pablo-sg-pacheco funcionou para mim, o carregamento automático depende do compositor ainda compatível com os padrões de codificação do WordPress, no entanto, o URL do repositório do Github é:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

e o nome do pacote é:

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

Por fim, 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"
}] 
guillaume.molter
fonte