web-dev-qa-db-ja.com

クラス名の大文字PHP

システムに2つのクラスがあります。 1つはファイルと呼ばれ、もう1つはファイルと呼ばれます。ローカルホストでファイルをインスタンス化するとファイルオブジェクトを取得しますが、同じスクリプトを実行している友人は大文字が認識されず、「file」が「File」と等しいようにFileのオブジェクトを取得します。それは設定可能なものですか?どちらもWindowsで実行しています。私はWampServerを持っています、彼はXAMPPを持っています。

20
Somal

PHPは、クラスの命名で大文字と小文字を区別しません。これは、クラスの名前がFileであっても、通常は$file = new file()を実行できることを意味します。その逆も同様です。

万が一、クラスファイルの自動読み込みに依存していますか?この場合、コンピューターによっては、インタープリターが常に同じファイルを最初に見つけるとは限らない可能性があります。これで問題が説明されます。

クラスの名前を変更することを強くお勧めします。 2つの異なるものを区別するために大文字と小文字を区別することは常に悪い考えであり、慣例により、クラス名は常に大文字で始まります。

クラス名を変更できない場合は、 php名前空間 を確認することをお勧めします。

49
krtek

PHPのクラス名では、大文字と小文字は区別されません(オペレーティングシステムに依存しません)

class myclass {}

$x = new MYclaSS;

var_dump($x);

object(myclass)#1 (0) {
}

一般的なアドバイスとして:あなたはそこから始めて何かを混ぜようとすべきではありません:)

このようなコードはnot動作するはずです:

class ab {}

class AB {}

Fatal error: Cannot redeclare class AB in ... on line x
16
edorian

クラスファイルに何らかの遅延読み込みを使用していると思いますが、PHPフレームワーク)でプログラミングしている可能性があります。秘密はあなたの__autoload関数にあります。それを見つけてください。

チェック 自動読み込みのPHPマニュアル

次のコード:

<?php

class file {
    public $a;
}

class File {
    public $a2;
}

$x = new file();

エラーが発生します:Cannot redeclare class File繰り返しになりますが、トリックはどのファイルが含まれているかということかもしれません。

コードの動作は、クラスの1つがロードされていないことを示しています(そうでない場合は、class redeclare errorが表示されます)。おそらく、最初にfileクラスをロードし、次にFileの定義が見つかると、(PHPの大文字と小文字を区別しない動作のために)クラスがすでにロードされていると単純に想定するのはオートローダーです。 。

1
vbence