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 ( __autoload
ou 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 strtolower
e similares.