As funções do PHP diferenciam maiúsculas de minúsculas?


100

Eu estava vasculhando alguns códigos e encontrei algumas ligações para mySQL_fetch_array. O PHP diferencia maiúsculas de minúsculas em nomes de funções? Lembro-me de ter lido isso em algum lugar, mas não consigo encontrar qualquer referência a ele.


1
Não, eles não parecem ser. a preferência é geralmente minúscula
Jason,

3
Duplicado de stackoverflow.com/questions/2749781/… . Não, as funções não diferenciam maiúsculas de minúsculas
Bob Baddeley,

Para referência: está enterrado aqui no meio php.net/manual/en/functions.user-defined.php em um bloco Nota : .
mario

3
Eu voto para deixar isso em aberto - o título é muito mais geral e explícito, portanto, é provável que ajude mais pessoas.
coreyward de

Respostas:


100

Estou citando isto :

Observação: os nomes das funções não fazem distinção entre maiúsculas e minúsculas, embora geralmente seja uma boa forma chamar as funções conforme aparecem em suas declarações.

Então, parece que as funções definidas pelo usuário não diferenciam maiúsculas de minúsculas, houve uma votação para tornar as funções / objetos no PHP5 diferenciando maiúsculas de minúsculas.


3
PHP5 já está lançado, sua única esperança é PHP6 e eu não acho que eles dariam esse passo. Seria muito quebrado por pouco ganho.
Mark Tomlin

3
@Mark Tomlin Eu discordo. A melhor prática é manter o mesmo caso que o manual tem, então ele deve quebrar pouco, enquanto aumenta a clareza.
Ben Dauphinee de

12
Uau. isso é triste. embora ImAgEcReAtEfRoMpNg () seja uma boa maneira de ofuscar código ...
Pontomedon

8
Visto que a citação diz "não faz distinção entre maiúsculas e minúsculas", por que você diz "Então, parece que a definição pelo usuário diferencia maiúsculas de minúsculas"? Se for um erro de digitação, você realmente deve corrigi-lo.
Barmar

11
Uau! É muito bom descobrir isso após 7 anos de codificação!
Daan

34

Não.

As funções do PHP não diferenciam maiúsculas de minúsculas.


19

TL; DR: os nomes das classes não fazem distinção entre maiúsculas e minúsculas, mas usam sempre o mesmo caso que na declaração (o mesmo que com funções). Além disso, instanciar classes com maiúsculas e minúsculas conforme foram definidas pode causar problemas com os carregadores automáticos.


Além disso, os nomes das classes não diferenciam maiúsculas de minúsculas:

<?php
class SomeThing {
  public $x = 'foo';
}

$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);

Isso resulta em:

class SomeThing#1 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#2 (1) {
  public $x =>
  string(3) "foo"
}
class SomeThing#3 (1) {
  public $x =>
  string(3) "foo"
}

O problema é usar carregadores automáticos e sistemas de arquivos com distinção entre maiúsculas e minúsculas (como ext2 / 3/4), em que você deve chamar o nome da classe com o mesmo caso em que o arquivo que contém a classe é nomeado (não como o nome da classe está realmente em maiúsculas), ou use strtolower:

O arquivo da classe:

<?php
// filename something.php
class SomeThing {
   ...
}

A função autoloader ( __autoloadou uma função para registrar spl_autoload_register)

function my_autloader($className) {
  $filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
  if (file_exists($filename)) {
    require($filename);
  }
}

Agora com este código:

$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work

Você pode fazer este trabalho (ou seja, ter nomes de classe que não diferenciam maiúsculas de minúsculas usando um autoloader) se você adicionou uma chamada a strtolower()no código do autoloader, mas, como acontece com as funções, é melhor fazer referência a uma classe da mesma forma como ela é declarada, tenha o nome do arquivo com o mesmo caso do nome da classe, use autoloaders e esqueça de usar strtolowere similares.


7

Não, eles não fazem distinção entre maiúsculas e minúsculas, no entanto, você deve sempre usar o caso que está no manual, para consistência.

No entanto, as variáveis diferenciam maiúsculas de minúsculas.


3

Em PHP, as variáveis ​​diferenciam maiúsculas de minúsculas, mas as funções não têm problemas como este. Você pode usar as seguintes instruções para exibir a saída, todas mostrarão o mesmo resultado.

<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>

Por outro lado, se você alterar a diferenciação de maiúsculas e minúsculas das variáveis, ele mostrará o erro.

Exemplo:

<?php
$a=5;
echo $A;// It will show the error.
?>

Resultado:

Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3

2

E os nomes dos métodos também não diferenciam maiúsculas de minúsculas. por exemplo:-

<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

resultado:

PHP Fatal error:  Cannot redeclare C::METHOD() in ....php on line 6

1

Concluindo a resposta de todos. Mesmo que o PHP não exija consistência de maiúsculas e minúsculas em todas as instâncias, até agora no PHP5.

A melhor prática será

sempre use os mesmos casos ao fazer referência a variáveis ​​(é 'obrigatório) ou funções (é' opcional, mas recomendado).

Você nunca sabe que talvez um dia a votação passe e você salvará todo o pesadelo de mudar os casos em seus aplicativos feitos há alguns anos que requerem atualização em PHP.

Espero que ajude de alguma forma.


Re "salvar todo o pesadelo de mudar os casos": Não, meu entendimento é que, se a mudança for feita, a distinção entre maiúsculas e minúsculas seria uma opção, definida no php.ini. Preservando assim a compatibilidade com versões anteriores.
Toolmaker Steve

-2

Pode ser tarde demais, mas ...

Todo mundo já sabe aqui: o motor PHP não se preocupa com maiúsculas e minúsculas.

E há a votação sobre o bugtracker do PHP, onde a maioria diz: "Sim, sou pró case sensetivity".

Mas estou contra, porque no meu framework MVC, chamo a ação do controlador:

    $currentController = new $controller($parameters);
    $currentAction = $currentController->{$action}();

$ controller e $ action são retirados da URL como estão.

Pense, se um usuário publicar um link para meu site: https: // my-site / MyPartnerController / MyPartnerGallery

enquanto a classe é chamada de myPartnerController ...

Isso significa que ninguém ganha esta página se os nomes das classes e funções do PHP forem sensíveis a maiúsculas e minúsculas.

Sim, sempre uso todos os nomes no código conforme declarado. Mas rezo para que eles nunca façam distinção entre maiúsculas e minúsculas nos nomes de funções e classes.

Obrigado!


1
isso é muito ruim ... se eu fosse para my-site / myLogInPage / loginsuccess , e tentasse algumas suposições sobre o que você chamou de função de sucesso de login, eu estaria ou seria capaz de apagar algumas coisas ....
Tschallacka
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.