4

index.php内の名前空間クラスを取得するために、本当に基本的なオートローダーを設定しましたhello.php。私の開発環境はUbuntu12.04です。

なぜ私はこれをしようとしているのですか?私はPSR-1PSR-2のコーディング標準に固執しようとしています。これには次のものが含まれます。

クラス名はStudlyCapsで宣言する必要があります

名前空間は/Vendor/ Classのとおりです(注:大文字)

以下は、大文字に変更を加える前に機能 する私の構造とコードです。

フォルダ構造

- web
  -- index.php
  -- core
    --- hello.php

オートローダー

index.php内に、オートローダーがあります。

set_include_path(__DIR__);
spl_autoload_extensions('.php,.class.php');
spl_autoload_register();

クラスファイル

コアフォルダ内に、hello.phpがあります

namespace core;

class hello {
    public function __construct() {
        echo 'Constructed!';
    }
}

動作するコード

で走る$obj = new \core\hello();index.php「Constructed!」に戻ります。素晴らしい!


うまくいかないもの

コアフォルダの名前を「Core」に変更します-大文字のCと、の名前空間に注意してhello.phpくださいnamespace Core;

では、もう一度試してみましょう$obj = new \Core\hello();

Fatal error: Class 'Core\hello' not found in ...

では、なぜ大文字を使用してPSR標準に準拠できないのですか?私は何が間違っているのですか?

4

3 に答える 3

8

LinuxプラットフォームでPHPコードを実行する場合、Linuxではファイル名の大文字と小文字が区別されることを覚えておくことが重要です。

オートローダーは通常、ロードするファイル名を作成するときに名前空間とクラス名を使用するため、これはオートローダーに影響します。

フォルダの名前が、の場合、名前空間は同じ大文字の、であるcore必要があります。名前空間でにcore変更する場合は、フォルダ名にも同じことを行う必要があります。Core(その結果、他のすべてのcoreクラスを同時に変更する必要がありますCore)。

Windowsでは、Windowsファイルシステムで大文字と小文字が区別されないため、これは発生しません。これは、コードがテストされてローカルのWindowsベースの開発システムで動作するときに混乱を引き起こし、Linuxベースのサーバーにコピーされると中断する可能性があります。

[編集]

さて、あなたがdirnameも変更したことを見逃しました。それでも、これはファイル名/ディレクトリ名の場合の問題だと思います。

spl_autoload_register()パラメータなしで呼び出していることに注意してください。これは、デフォルトのspl_autoload()機能がオートローダーとして使用されることを意味します。

のドキュメントspl_autoload()を読むと、クラスと名前空間の小文字バージョンが使用されていることに気付くでしょう。

つまり、デフォルトのオートローダーを使用すると、クラスを大文字と小文字を混在させることができますが、フォルダー構造とファイル名はすべて小文字にする必要があります。

したがって、実際には、ファイル名を小文字に保つ必要があります。

私は、元の回答のように、完全に小文字のファイル名を持っていて、Windows開発ボックスからLinuxサーバーに移動したときに大文字と小文字が混在するクラス名が壊れていたので、個人的にそれを逆に経験しました。私の経験があなたの経験と異なる理由は、自動小文字変換を行わないカスタム作成の自動ロード関数を使用しているためです。したがって、ファイル名の大文字と小文字はクラス名の大文字小文字と一致する必要があります。

于 2013-02-22T15:34:57.483 に答える
2

あなたは私たちにいくつかの良い曖昧さを示したと思います。私が間違っている場合は私を訂正してください。

仕様によれば、インスタンス化されるクラス(および名前空間)の小文字の名前を使用する必要があります。(http://www.php.net/manual/en/function.spl-autoload.php

しかし、PSRは大文字を使用するように指示しています。PSRを使い続けたい場合は、デフォルトのspl_autoloadを独自のものに上書きする必要があります。

于 2013-10-23T12:44:35.493 に答える
1

これに問題がある他の人のために、ucfirst()またはstrtolower()を利用してみませんか?

したがって、以下のコードはすべて小文字を試し、最初の文字の大文字ファイルも試します

例:somename.class.phpまたはSomename.class.php

is_readable()は、ファイルが見つからない場合のphpエラーを表示しないように最初にチェックします。

spl_autoload_register(function($name) {

    if (is_readable(strtolower($name).'.class.php')) {
        require_once(strtolower($name).'.class.php');
    } 
    elseif (is_readable(ucfirst($name).'.class.php')) {
        require_once(ucfirst($name).'.class.php');
    }
});
于 2014-01-28T01:33:03.013 に答える