5

特にエイリアス、つまりクラスのインポートに関しては、phpで名前空間を実装することにかなり混乱しています。

このチュートリアルのチュートリアルに従いました:

しかし、私は理解__autoload__autoloadませ.

<?php
namespace barbarian;
class Conan {
    var $bodyBuild = "extremely muscular";
    var $birthDate = 'before history';
    var $skill = 'fighting';
}
namespace obrien;
class Conan {
    var $bodyBuild = "very skinny";
    var $birthDate = '1963';
    var $skill = 'comedy';
}
use \barbarian\Conan as mother;
$conan = new mother();
var_dump($conan);
var_dump($conan->bodyBuild);

$conan = new \obrien\Conan();
var_dump($conan);
var_dump($conan->birthDate);
?>

Conan.phpのフォルダーに保存しないと、エラーが発生しますが、barbarian

<?php
require_once "autoload.php"; 
use \barbarian\Conan as Cimmerian;
$conan = new Cimmerian();
var_dump($conan);
?>

エラーメッセージ、

警告: require(barbarian/Conan.php): ストリームを開けませんでした: No such file or directory in C:\wamp\www\test\2013\php\namepsace\autoload.php 行 12

autoload.php:

<?php
function __autoload($classname) {
  $classname = ltrim($classname, '\\');
  $filename  = '';
  $namespace = '';
  if ($lastnspos = strripos($classname, '\\')) {
    $namespace = substr($classname, 0, $lastnspos);
    $classname = substr($classname, $lastnspos + 1);
    $filename  = str_replace('\\', '/', $namespace) . '/';
  }
  $filename .= str_replace('_', '/', $classname) . '.php';
  require $filename;
}
?>

エイリアス クラスをフォルダーに格納する必要がありますか? 使用時にクラスをフォルダに保存せずにインポートすることはできますautoloadか?

4

2 に答える 2

8

名前空間を使用してクラスを自動ロードするということは、規則に従う必要があることを意味します。通常、その規則にはフォルダーの使用が含まれます ( PSR-0 と比較してください)。

時々その規則に従うクラスがある場合、オートローダーはフォルダーを使用するかどうかをどのように判断しますか?

したがって、最終的には、クラスは名前空間に従ってフォルダーに格納する必要がありますフォルダー構造が意味をなさないと思われる場合は、名前空間とフォルダー構造の両方を変更して、本当に必要なものを反映する必要があります。

于 2013-03-28T17:57:56.370 に答える
3

ディレクトリを使用したくない場合は、必ずしも使用する必要はありません。もちろん、この例では使用していますが、任意の方法でロードを実装できます。すべてのクラスを 1 つのフォルダーに配置し、フォームでアンダースコア文字を使用できますClasses/Barbarian_Conan.php。しかし、それは非常に厄介になる可能性があり、クラスまたは名前空間の名前にアンダースコアが含まれている場合はどうすればよいかを考えなければなりません!

とはいえ、このようにディレクトリを使用することは良い考えです。さらに、他の PHP ソフトウェアとの相互運用性を最大限に高めるには、PSR-0に従うことをお勧めします。この標準化グループの詳細については、こちらをご覧ください

私が Web で発見し、あなたが実験で発見したように、クラス名にも名前空間のパス名にも PHP の予約語が含まれていない可能性があります。

于 2013-03-28T18:08:25.417 に答える