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.