15

PHPのドキュメントによると、class_exists()大文字と小文字は区別されません。しかし、私はそうなっていることを経験しています。たとえば、class_exists("\\My\\Class")trueを返しますが、class_exists("\\My\\class")falseを返します。

PHP5.3.3を実行しています。私は2つの別々の環境を持っています。これは一方の環境では正しく機能していますが、もう一方の環境はケースを気にするように動作しています。

私は何が欠けていますか?どこかに設定設定はありますか?

アップデート:

この問題を経験している他の人のために、私は問題を見つけました。class_exists()宣言されていないクラスにはオートローダーを使用します。class_exists()によって返されるリストにクラスが表示されている限り、大文字と小文字は区別されませんget_declared_classes()。ただし、探しているクラスがこのリストに表示されない場合は、登録されているオートローダースタックに依存して検索します。file_exists()私のプロジェクトが使用しているオートローダーはSymfony2のUniversalClassLoaderであり、最終的にはクラスのオートロードに依存しています。file_exists()システムの環境で大文字と小文字が区別される限り、大文字と小文字が区別されます。これが、一方の環境で問題が発生し、もう一方の環境では問題が発生しなかった理由です。大文字と小文字を区別しないオートローダーを追加することで、この問題を解決する方法はたくさんあります。大文字と小文字を区別しない良い例もいくつかありますfile_exists()ドキュメントコメントの実装。

問題を効果的に伝えず、実際のコードの代わりに疑似例を提供することで、皆さんの時間を無駄にしてしまったことを心からお詫び申し上げます。私の問題の核心にたどり着くという私の意図ではなく、私の疑似例は気を散らすものでした。私は失敗しました、そしてそのために私は本当に申し訳ありません。

4

1 に答える 1

16

Windows / MacとLinuxを比較していますか?

ファイルが存在すると仮定しますWooby\Dooby\Foo.php。次の内容で:

<?php
namespace Wooby\Dooby;

class Foo {}

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

クラスがすでに存在する場合、それを参照するためにどのような場合を使用するかは関係ありません。クラスは次のように検出されます。

<?php

require "Wooby/Dooby/Foo.php";

echo "Class Wooby\\Dooby\\foo does " . (class_exists("Wooby\\Dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class wooby\\dooby\\foo does " . (class_exists("wooby\\dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class Wooby\\Dooby\\Foo does " . (class_exists("Wooby\\Dooby\\Foo") ? '' : "NOT") . " exist\n";

上記のテストファイルを実行すると、次のようになります。

-> php index.php 
Class Wooby\Dooby\foo does  exist
Class wooby\dooby\foo does  exist
Class Wooby\Dooby\Foo does  exist

ファイルシステムでは大文字と小文字が区別されます

クラスが存在せ、オートローダーを使用している場合は、ケースが重要です。単純なオートローダーを使用するように変更された上記の例を考えてみましょう。

<?php
ini_set('display_errors', 0);

function __autoload($name) {
    $file = str_replace('\\', '/', $name) '.php';
    if (file_exists($file)) {
        include $file;
    }
}

echo "Class Wooby\\Dooby\\foo does " . (class_exists("Wooby\\Dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class wooby\\dooby\\foo does " . (class_exists("wooby\\dooby\\foo") ? '' : "NOT") . " exist\n";
echo "Class Wooby\\Dooby\\Foo does " . (class_exists("Wooby\\Dooby\\Foo") ? '' : "NOT") . " exist\n";

結果は次のようになります。

-> php index.php 
Class Wooby\Dooby\foo does NOT exist
Class wooby\dooby\foo does NOT exist
Class Wooby\Dooby\Foo does  exist

オートローダーは欠落しているクラス名に一致するパスを探しているため、ファイルを含めてクラスをロードする最後のエントリのみがトリガーされます。

大文字と小文字を区別しないファイルシステムを使用するWindowsまたはMac1を使用している場合を除きます。

概要

phpのクラス名では大文字と小文字は区別されませんが、ファイルシステムの大文字と小文字の区別を効果的に継承するため、コードはおそらく大文字と小文字を区別します。明らかに、一貫したケースを使用し、PHPが怠惰な開発習慣を修正することに依存しないことが最善です。

class_existsには、存在しないクラスを探すときにオートローダーの使用をオンまたはオフ(デフォルトでオン)にするパラメーターがあることに注意してください。

脚注

1より正確には、HFSはデフォルトで大文字と小文字を区別しませんが、大文字と小文字を保持します。

于 2013-03-19T08:41:53.947 に答える