TL; DR: los nombres de las clases no distinguen entre mayúsculas y minúsculas, pero usan siempre el mismo caso que en la declaración (lo mismo que con las funciones). Además, la creación de instancias de clases con diferentes mayúsculas y minúsculas tal como se definieron puede causar problemas con los cargadores automáticos.
Además, los nombres de las clases no distinguen entre mayúsculas y minúsculas:
<?php
class SomeThing {
public $x = 'foo';
}
$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);
Esto produce:
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"
}
El problema es el uso de cargadores automáticos y sistemas de archivos que distinguen entre mayúsculas y minúsculas (como ext2 / 3/4), ya que debe llamar al nombre de la clase con el mismo caso en el que se nombra el archivo que contiene la clase (no cómo el nombre de la clase está realmente en mayúsculas), o use strtolower
:
El archivo de clase:
<?php
// filename something.php
class SomeThing {
...
}
La función de autocargador ( __autoload
o una función para registrarse spl_autoload_register
)
function my_autloader($className) {
$filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
if (file_exists($filename)) {
require($filename);
}
}
Ahora con este código:
$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work
Puede hacer que esto funcione (es decir, tener nombres de clase que no distingan entre mayúsculas y minúsculas utilizando un cargador automático) si agregó una llamada a strtolower()
en el código del cargador automático, pero al igual que con las funciones, es mejor hacer referencia a una clase de la misma manera que se declara, tenga el nombre del archivo con el mismo caso que el nombre de la clase, use autocargadores y olvídese de usar strtolower
y los me gusta.