Le funzioni PHP fanno distinzione tra maiuscole e minuscole?


100

Stavo cercando un codice e ho trovato alcune chiamate a mySQL_fetch_array. PHP fa distinzione tra maiuscole e minuscole sui nomi delle funzioni? Ricordo di aver letto questo da qualche parte ma non riesco a trovare alcun riferimento ad esso.


1
No, non sembrano esserlo. la preferenza è solitamente minuscola
Jason

3
Duplicato di stackoverflow.com/questions/2749781/… . No, le funzioni non fanno distinzione tra maiuscole
Bob Baddeley

Per riferimento: è sepolto qui nel mezzo php.net/manual/en/functions.user-defined.php in una Nota: block.
mario

3
Voto per lasciarlo aperto: il titolo è molto più generale ed esplicito, quindi è probabile che aiuti più persone.
coreyward

Risposte:


100

Sto citando da questo :

Nota: i nomi delle funzioni non fanno distinzione tra maiuscole e minuscole, sebbene di solito sia una buona forma chiamare le funzioni così come appaiono nella loro dichiarazione.

Quindi, sembra che le funzioni definite dall'utente non facciano distinzione tra maiuscole e minuscole, c'è stato un voto per rendere funzioni / oggetti in PHP5 sensibili al maiuscolo / minuscolo.


3
PHP5 è già uscito, la tua unica speranza è PHP6 e non credo che farebbero questo passo. Si spezzerebbe troppo per poco guadagno.
Mark Tomlin

3
@ Mark Tomlin Non sono d'accordo. La migliore pratica è mantenere la stessa custodia del manuale, quindi dovrebbe rompere poco, aumentando la chiarezza.
Ben Dauphinee

12
Wow. quello è triste. anche se ImAgEcReAtEfRoMpNg () è un bel modo per offuscare il codice ...
Pontomedon

8
Poiché la citazione dice "case-insensitive", perché dici "Quindi sembra che definito dall'utente sia case-sensitive"? Se è un errore di battitura, dovresti davvero risolverlo.
Barmar

11
Wow! Questo è davvero bello scoprirlo dopo 7 anni di programmazione!
Daan

34

No.

Le funzioni PHP non fanno distinzione tra maiuscole e minuscole.


19

TL; DR: i nomi delle classi non fanno distinzione tra maiuscole e minuscole, ma usano sempre lo stesso caso della dichiarazione (lo stesso delle funzioni). Inoltre, la creazione di istanze di classi con maiuscole e minuscole diverse come sono state definite può causare problemi con i caricatori automatici.


Inoltre, i nomi delle classi non fanno distinzione tra maiuscole e minuscole:

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

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

Questo 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"
}

Il problema è l'utilizzo di caricatori automatici e file system sensibili al maiuscolo / minuscolo (come ext2 / 3/4), in quanto è necessario chiamare il nome della classe con lo stesso caso in cui è denominato il file contenente la classe (non come viene effettivamente scritto il nome della classe), oppure usa strtolower:

Il file di classe:

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

La funzione del caricatore automatico ( __autoloado una funzione con cui registrarsi spl_autoload_register)

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

Ora con questo codice:

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

Puoi farlo funzionare (es. Avere nomi di classe che non fanno distinzione tra maiuscole e minuscole utilizzando un caricatore automatico) se hai aggiunto una chiamata a strtolower()nel codice del caricatore automatico, ma come con le funzioni, è semplicemente meglio fare riferimento a una classe nello stesso modo in cui è dichiarato, avere il nome del file con la stessa maiuscola del nome della classe, utilizzare i caricatori automatici e dimenticare di usare strtolowere simili.


7

No, non sono senza maiuscole e minuscole, tuttavia, è necessario utilizzare sempre il caso che sia nel manuale, per la coerenza.

Tuttavia, le variabili fanno distinzione tra maiuscole e minuscole.


3

In PHP le variabili fanno distinzione tra maiuscole e minuscole ma le funzioni non hanno problemi come questo. Puoi usare le seguenti istruzioni per visualizzare l'output, tutte mostreranno lo stesso risultato.

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

D'altra parte, se si modifica la distinzione tra maiuscole e minuscole delle variabili, verrà visualizzato l'errore.

Esempio:

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

Produzione:

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

2

E anche i nomi dei metodi non fanno distinzione tra maiuscole e minuscole. per esempio:-

<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

produzione:

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

1

In conclusione la risposta di tutti. Anche se PHP non richiede la coerenza tra maiuscole e minuscole in tutti i casi, anche fino ad ora in PHP5.

La migliore pratica sarà

usa sempre gli stessi casi quando si fa riferimento a una delle variabili (è 'obbligatorio) o alle funzioni (è' opzionale, ma consigliato).

Non si sa mai forse un giorno il voto passerà e risparmierai l'intero incubo di cambiare i casi nelle tue applicazioni fatte un paio di anni fa che richiedono l'aggiornamento in PHP.

Spero che aiuti comunque.


Ri "salva l'intero incubo di cambiare i casi": No, la mia comprensione è che se la modifica viene mai apportata, la distinzione tra maiuscole e minuscole sarebbe un'opzione, impostata in php.ini. Conservando così la retrocompatibilità.
ToolmakerSteve

-2

Potrebbe essere troppo tardi, ma ...

Tutti lo sanno già qui: il motore PHP non si preoccupa del caso delle lettere.

E c'è il voto su PHP bugtracker, dove la maggioranza dice: "Sì, sono pro case sensetivity".

Ma sono contrario, perché nel mio framework MVC, chiamo l'azione del controller:

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

$ controller e $ action vengono presi dall'URL così com'è.

Pensa, se un utente pubblica un collegamento al mio sito: https: // my-site / MyPartnerController / MyPartnerGallery

mentre la classe è denominata myPartnerController ...

Significa che nessuno guadagna mai questa pagina se i nomi delle classi e delle funzioni di PHP fanno distinzione tra maiuscole e minuscole.

Sì, utilizzo sempre tutti i nomi nel codice come dichiarato. Ma prego che non facciano mai distinzione tra maiuscole e minuscole per i nomi delle funzioni e delle classi.

Grazie!


1
è davvero brutto ... se andassi su my-site / myLogInPage / loginsuccess e provassi a fare qualche ipotesi su quella che hai chiamato la tua funzione di successo dell'accesso, sarei in grado di cancellare alcune cose ...
Tschallacka
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.