2

私はindex.phpを持っています:

<?php

include_once('X\X.php');

$y= new X\X();
$y->HelloWorld();

?>

また、index.php が ROOT フォルダーにあるとします。ROOT\XI には、X.php というファイルがあります。

<?php 
namespace X;
     class X{
        public function HelloWorld(){
            echo 'Hello!';
        }
    }
?>

私の質問は、これは index.php に include_('X\X.php') がある場合にのみ機能するということです。とにかくこんにちは!ファイルを含めずに?

名前空間とそれらが実際にどのように使用されているかを学ぼうとしています。既にファイルをインクルードしているのに、名前空間を気にする必要はありません。

4

2 に答える 2

3

インクルードなしで名前空間を使用できます。これはあまりお勧めできませんが、実行できます。

特定の PHP ファイルは、完全に名前空間を指定するか、名前空間をまったく指定しない必要があります。したがって、ファイルに名前空間を含める場合は、名前空間宣言で開始する必要があります (つまり、コードの最初の行)。

それができたら、(もう一度言いますが、お勧めしませんが) 名前空間を同じファイルのさらに下に変更することは合法です (もちろん、クラスや関数の外側であることは明らかです)。

この同じ学習演習の一環として、PHP の Autoload メカニズムについて学ぶ時間をとることを強くお勧めします。名前空間と非常にうまく連携し、コードをクラスごとに個別のファイルに分割できますが (ベスト プラクティスの推奨に従って)、必要な各ファイルを手動で含める必要はありません。

于 2013-01-18T20:40:16.927 に答える
1

spl_autoload_register () とその仲間、つまり Spl Autoload メカニズムとinclude_pathini ディレクティブについて学んでください。それはクールなもので、多くの頭痛の種から解放されます! :)

ただし、オートローディングは魔法ではありません。これは、以前に含まれていなかったユーザー定義クラスにアクセスするときに Zend エンジンが呼び出す「フック」メカニズムにすぎません。autoload メソッドのパラメーターはクラス名です。このメソッドは、クラス名をファイル名に解決し、include または require (*_once) を使用してそれを含める必要があります。

あなたの場合、ファイル X.php がフォルダー X のクラスパスのどこかにあると仮定すると、次のように名前を解決できます。

// define your autoloader
function the_autoloader($classname) {
    // $classname  will 'X\X' in the example
    $filename = str_replace('\\', '/', $classname) . '.php';
    require $filename;
}

// register the autoloader
spl_autoload_register('the_autoloader');


// from this point you are free to instantiate every class
// that can be resolved by the_autoloader() without writing 
// an explicit include statement

$y= new X\X();
$y->HelloWorld();

ご覧のように、オートローディングはクラスの使用を容易にし、「バックグラウンドで」ファイルをインクルードしますが、それらをインクルードする必要があります。したがって、質問に対する答えは次のとおりです。使用する前にクラスファイルを含める必要があります

于 2013-01-18T20:45:52.593 に答える