PHP関数では大文字と小文字が区別されますか?


100

いくつかのコードを調べていたところ、への呼び出しがいくつか見つかりましたmySQL_fetch_array。PHPは関数名について大文字と小文字を区別しますか?私はどこかでこれを読んだことを思い出しますが、それへの参照を見つけることができないようです。


1
いいえ、そうではありません。通常は小文字が優先されます
Jason

3
stackoverflow.com/questions/2749781/…の複製。いいえ、関数では大文字と小文字が区別されません
ボブバデリー

参考までに、注意:ブロックの中央のphp.net/manual/en/functions.user-defined.phpに埋め込まれています。
マリオ

3
私はこれを公開することに投票します—タイトルははるかに一般的で明確であるため、より多くの人々を助ける可能性があります。
coreyward 2011

回答:


100

私はこれから引用しています

注:関数名は大文字と小文字が区別されませんが、通常、宣言にあるとおりに関数を呼び出すのが適切です。

そのため、ユーザー定義関数では大文字と小文字が区別されないように見え、PHP5で関数/オブジェクトを大文字と小文字を区別するように投票されました。


3
PHP5はすでにリリースされています。あなたの唯一の希望はPHP6であり、私は彼らがその一歩を踏み出すことはないと思います。それは少しの利益のために多くに壊れるでしょう。
マークトムリン

3
@Mark Tomlin同意しない。ベストプラクティスは、マニュアルと同じケースを維持することです。そのため、明快さを増しながら、ほとんど破損しないはずです。
ベン

12
ワオ。それは悲しいです。ただし、ImAgEcReAtEfRoMpNg()はコードを難読化する良い方法です...
ポントメドン

8
引用が「大文字と小文字を区別しない」と言っているのに、なぜ「ユーザー定義は大文字と小文字を区別するように見える」と言うのですか?それがタイプミスである場合は、実際に修正する必要があります。
Barmar 2013

11
うわー!これは、7年間のコーディングの後で知って本当に良かったです!
Daan

34

番号。

PHP関数は大文字と小文字を区別しません


19

TL; DR:クラス名では大文字と小文字が区別されませんが、宣言と同じ大文字小文字を常に使用します(関数の場合と同じ)。また、クラスの定義時に大文字と小文字が異なるクラスをインスタンス化すると、オートローダーで問題が発生する可能性があります。


また、クラス名では大文字と小文字が区別されません。

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

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

これは出力します:

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

問題は、オートローダーと大文字と小文字を区別するファイルシステム(ext2 / 3/4など)を使用していることです。つまり、クラスを含むファイルの名前と同じ大文字小文字でクラス名を呼び出す必要があります(実際のクラス名の大文字小文字の区別ではありません)。または使用strtolower

クラスファイル:

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

オートローダー機能(__autoloadまたはに登録する機能spl_autoload_register

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

今このコードで:

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

strtolower()オートローダーコードにへの呼び出しを追加した場合、この作業を行うことができます(つまり、オートローダーを使用して大文字と小文字を区別しないクラス名を実質的に持つ)が、関数と同様に、宣言されているのと同じ方法でクラスを参照する方がよいクラス名と同じ大文字小文字のファイル名を持ち、オートローダーを使用し、使用などを忘れstrtolowerます。


7

いいえ、彼らはされていない大文字と小文字を区別し、しかし、あなたは常に一貫性を保つために、手動である場合を使用する必要があります。

ただし、変数で大文字と小文字が区別されます。


3

PHPでは、変数では大文字と小文字が区別されますが、関数にはこのような問題はありません。次のステートメントを使用して出力を表示すると、すべて同じ結果が表示されます。

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

一方、変数の大文字と小文字の区別を変更すると、エラーが表示されます。

例:

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

出力:

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

2

また、メソッド名も大文字と小文字を区別しません。例えば:-

<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

出力:

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

1

みんなの反応の結論です。にもかかわらず、PHPは、PHP5でも、今までのすべてのインスタンスの文字ケースの一貫性を必要としません。

ベストプラクティスは

変数(その必須)または関数(そのオプションですが、推奨)を参照する場合は常に同じケースを使用します。

いつか投票が成立したことを知らないので、数年前に作成されたアプリケーションでPHPの更新が必要なケースを変更するという悪夢をすべて救うことができます。

とにかくそれが役に立てば幸い。


「ケースの変更による悪夢をすべて保存する」について:いいえ、私の変更は、変更が行われた場合、php.iniで設定される大文字と小文字の区別がオプションになることを理解しています。したがって、下位互換性を維持します。
ToolmakerSteve 2014

-2

遅すぎるかもしれませんが...

PHPエンジンは文字の大文字小文字を区別しません。

そして、PHPバグトラッカーへの投票があり、大多数は「はい、私はプロのケースセンスです」と述べています。

しかし、私はMTRAフレームワークでコントローラーアクションを呼び出すので、私は反対です:

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

$ controllerと$ actionはそのままURLから取得されます。

ユーザーが私のサイトへのリンクを公開した場合、考えてみてください。 https:// my-site / MyPartnerController / MyPartnerGallery

クラスの名前がmyPartnerControllerである間...

これは、PHPのクラスと関数名で大文字と小文字が区別される場合、誰もこのページを取得しないことを意味します。

はい、宣言されているとおり、コードでは常にすべての名前を使用します。ただし、関数やクラスの名前で大文字と小文字が区別されないようにしてください。

ありがとうございました!


1
それは本当に悪いです... my-site / myLogInPage / loginsuccessに移動して、ログイン成功関数と呼ばれるものをいくつか推測したり、いくつかのものを消去したりすると...
Tschallacka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.