PHP の名前空間について説明します。 PHP の名前空間、名前空間の簡単な使用法について説明

(PHP 5 >= 5.3.0、PHP 7)

名前空間の使用について説明する前に、コードがどの名前空間要素を要求しているかを PHP がどのように認識するかを理解することが重要です。 PHP 名前空間とファイルシステムの間には、簡単な類似点が考えられます。 ファイル システム内のファイルにアクセスするには、次の 3 つの方法があります。

  1. のような相対ファイル名 foo.txt。 これで解決されるのは、 現在のディレクトリ/foo.txtここで、currentdirectory は現在占有されているディレクトリです。 したがって、現在のディレクトリが /ホーム/フー、名前は次のように解決されます。 /home/foo/foo.txt.
  2. のような相対パス名 サブディレクトリ/foo.txt。 これで解決されるのは、 現在のディレクトリ/サブディレクトリ/foo.txt.
  3. のような絶対パス名 /main/foo.txt。 これで解決されるのは、 /main/foo.txt.
同じ原則を PHP の名前空間要素にも適用できます。 たとえば、クラス名は次の 3 つの方法で参照できます。
  1. 修飾されていない名前、または次のような接頭辞のないクラス名 $a = 新しい foo();または foo::staticmethod(); 現在の名前空間、これは次のように解決されます 現在の名前空間\foo ふー. 1 つの注意: 名前空間関数または定数が定義されていない場合、関数および定数の非修飾名はグローバル関数および定数に解決されます。 詳細については、「名前空間の使用: グローバル関数/定数へのフォールバック」を参照してください。
  2. 修飾名、または次のような接頭辞が付いたクラス名 $a = 新しいサブネームスペース\foo();または サブネームスペース\foo::staticmethod();。 現在の名前空間が 現在の名前空間、これは次のように解決されます 現在の名前空間\サブ名前空間\foo。 コードがグローバルで名前空間のないコードの場合、これは次のように解決されます。 サブネームスペース\foo.
  3. 完全修飾名、または次のようなグローバル接頭辞演算子を含む接頭辞付きの名前 $a = 新しい \currentnamespace\foo();または \currentnamespace\foo::staticmethod();。 これは常に、コード内で指定されたリテラル名に解決されます。 現在の名前空間\foo.

実際のコードでの 3 種類の構文の例を次に示します。

名前空間 Foo\Bar\サブ名前空間;

const FOO = 1 ;
関数 foo()()
クラスフー
{
}
?>

名前空間 Foo\Bar;
「file1.php」をインクルードします。

const FOO = 2 ;
関数 foo()()
クラスフー
{
静的関数 staticmethod()()
}

/* 修飾されていない名前 */
foo(); foo::staticmethod(); エコー FOO ;

/* 修飾された名前 */
サブネームスペース\foo(); // 関数 Foo\Bar\subnamespace\foo に解決されます
サブネームスペース\foo::staticmethod(); // クラス Foo\Bar\subnamespace\foo に解決されます。
// 静的メソッド
エコーサブネームスペース\FOO; // 定数 Foo\Bar\subnamespace\FOO に解決されます

/* 完全修飾名 */
\foo\bar\foo(); // 関数 Foo\Bar\foo に解決されます
\foo\Bar\foo::staticmethod(); // クラス Foo\Bar\foo、メソッド staticmethod に解決されます
エコー\Foo\Bar\FOO; // 定数 Foo\Bar\FOO に解決されます
?>

グローバル クラス、関数、または定数にアクセスするには、次のような完全修飾名を使用できることに注意してください。 \strlen()または \例外または \INI_ALL. ?>

PHP では、バージョン 5.3 以降、名前空間が提供されるようになりました。 それ以来、この名前空間の使用方法について、緩やかながらも激しい議論が行われてきました。
Symphony、Laravel、そしてもちろん Zend などの一部のフレームワークは、このテクノロジーを採用しています。
これらすべては多かれ少なかれ MVC スキームに適合します。 おそらく永遠の議論が 1 つ残っています。それは、アプリケーションの主要な結合ペア (モデルとコントローラー) は何であるべきかということです。
モデルはがっしりと太っていて、コントローラーは細くて薄いべきだと言う人もいます。 一言で言えば、母系制。
逆に、コントローラーがすべてを管理し、指揮しなければならないと信じている人もいます。そのため、コントローラーはしっかりしていて栄養が豊富であることがわかります。 そして彼と一緒に、痩せていてほっそりしたモデルがいます。彼の仕事は結局のところ、与えることともたらすことです。 これは家父長制です。
では、MVC スキームではどちらが優れているのでしょうか? 家父長制か母系制か?
民主主義に基づいた家族単位の構築という観点から見てみましょう。 Namespace にこれを手伝ってもらいましょう。

私たちは、陶器店の雄牛のように、不注意だとアプリケーション全体を押しつぶしてしまう可能性がある、厚くて不格好なコントローラーを好みません。
私たちも太ったモデルは好きではありません。 さて、誰が好きなのでしょうか? 彼らは表彰台に値するに違いありません!
仲人さんのような名前空間の力を借りて、円満な家庭を築いていきましょう。

まず、アプリケーション フレームワークを作成しましょう。 ありきたりかもしれないが、それをブログにしておく。

以下のような基本構造を作成しました。

  • ブログはアプリケーションのストレージです。
  • ビューとテンプレート - ビューとテンプレートのストレージ。
  • ユーティリティ - 共有ライブラリのリポジトリ。
  • Index.php - ブートストラップ スクリプト。
  • Post - ここはコントローラーとモデルの家族の牧歌が行われる場所です。

Index.php を使用すると、すべてが簡単になります。

走る(); /* *index.phpの終わり*/

必要なパスを決定し、オートローダーを作成します。
オートローダーは、クラスの名前空間に応じたフォルダー階層にある必要なクラスを読み込みます。 たとえば、BlogPostServicesView クラスは Blog/Post/Services で検索されます。
そして、これがNamespaceとの最初の出会いです。
Index.php を開始すると、Blog アプリケーションのインスタンスが作成され、そのクラスは Blog/Blog.php からロードされます。
彼を見てみましょう。

post = 新しいPost(); ) public function run() ( $this->post->view->all(); ) )//end class Blog

Blog クラスを作成するとき、名前空間 BlogPost を使用して Post クラスをそのクラスに挿入し、オートローダーが Blog/Post/Post.php からそれをロードします。
おそらくこのクラスはコントローラーと呼ぶことができますが、

ビュー = 新しいビュー(); ) )//クラスの投稿を終了

Post エンティティには次のものが含まれます。
- データレコード自体の構造 - BlogPostEntitiesPostEntity.php

コントローラーリクエストを処理するサービス - BlogPostServicesView.php (サービスの 1 つなど)

db = 新しい DB(); )//end __construct public function all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper site",)); ) )//end class PostView

データベース対話システム - BlogPostRepositoriesDB.php - これが、私たちの薄くエレガントなモデルです。
与えるだけ、持ってくるだけで、それ以上は何も必要ありません。

dbh = 新しい PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "エラー!: " . $e->getMessage() . "
"; die(); ) )//end __construct public function surface() ( $query_view = $this->dbh->prepare("SELECT * from 投稿"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//調査終了 )//クラス Db 終了

その結果、すべてのコンポーネントが適切に接続されたアプリケーション構造を作成することができ、同時にクラスを明確に分離し、各クラスが独自のタスクを実行することができました。 当社のコントローラーは薄型であると同時に強力です。 モデルは彼と一致します。 完璧な家族!
すべて Namespace のおかげです。

多くの場合、フレームワークが便利であることに異論はありません。 しかし、名前空間を見て何も思い出せませんか?
クラスへの明確な分割、厳密かつ同時に柔軟なディレクトリとクラスの階層は、開発者に完全に従属します。
場合によっては、フレームワークの形式の数百のファイルとクラスの形式のこれほど重要なアドオンが存在しないこともあります。
クラスとコンポーネントの相互作用に関する Procrustean のルールが存在しない。

この記事は、Laravel フレームワークの作者である Taylor Otwell によるこのトピックに関する考えに触発されており、彼に多大な感謝を捧げます。
GitHub 上のサンプル ソース コードのアドレス。

最近、プロジェクトを名前空間にカプセル化しましたが、適切なドキュメントが不足しているという問題に遭遇しました。 私たちが見つけることができたものはすべて 2009 年に遡り、もうすぐ 2012 年になります... 見つかった資料には、php の現在のバージョンにないものを使用している機能しない箇所が多数あります。 これに関連して、この問題について少し説明したいと思います。
では、名前空間または名前空間とは何でしょうか? 偉大なウィキペディアでは次のように定義されています。

ネームスペースはセットであり、一意の識別子 (つまり、名前) を論理的にグループ化するために作成されたモデル、抽象ストレージ、または環境を意味します。 名前空間で定義された識別子は、その名前空間に関連付けられます。 同じ識別子を複数の空間で独立して定義できます。 したがって、ある名前空間で定義された識別子に関連付けられた値は、別の名前空間で定義された同じ識別子と同じ(またはむしろ異なる)意味を持つ場合があります(または持たない場合もあります)。 名前空間認識言語は、識別子がどの名前空間に属するかを示すルール (つまり、その定義) を定義します。wiki

すべてクリアですか? 実は簡単なんです。 バージョン 5.3 より前では、php には 2 つのスペースしかありませんでした。グローバル (メイン コードが実行される) とローカル (関数変数が定義される) です。

バージョン 5.3 以降、すべてが変更されました。 これで、クラス、メソッドなどが存在する名前空間を定義できるようになりました。


もう少しわかりやすくなったと思います。

特にクラスに同じ名前を付けました。 これらは異なる空間で定義されているため、名前は同じですが、2 つの異なるクラスです。 メイン スクリプトは引き続きグローバル空間で機能し、ここでは何も変更されておらず、クラスや関数を引き続きその中で定義できます。 では、スペースとは何のためにあるのでしょうか? まず、ファイルをフレームワークまたはライブラリにインクルードするときに、クラスがフレームワークのクラスをオーバーライドしたり、その逆が行われないことを確認します。

ネームスペースで定義されたクラスを使用するには、定義したスペースをグローバル スペースの適切な場所にインポートする必要があります (通常、これをファイルの先頭で行うことを好みます)。これを行うには、 use キーワードを使用します。

注意:何らかの理由でphpではキーワードの使用が許可されていません 使用条件ブロックおよびループ内

画像から例を取り出してコードに実装してみましょう。

注意:名前空間キーワードは、ファイルの先頭、直後に配置する必要があります。
ファイルA.php
B.phpファイル
別の構文も可能です。
各名前空間を別のファイルで宣言することをお勧めします。 1 つでも可能ですが、絶対にお勧めしません。
次に、メイン スクリプトが機能する 3 番目のファイルに移動しましょう。
インデックス.php
これはコードが追加されるだけで利点であるように思えますが、これは完全に真実ではありません。もう少し詳しく、ファイルとクラスを接続する線が不要になる自動ロード クラスの例を示します。
それでは、クラスを見てみましょう。

注意: PHP名前空間でスコープ解決演算子(::)を使用する 禁じられている! 唯一適しているのは、静的クラスのメソッドと定数へのアクセスです。 当初、彼らはそれを名前空間に使用したいと考えていましたが、その後、問題が発生したため、使用しないことにしました。 したがって、 A::A::say(); のような構造になります。 は無効なため、エラーが発生します。

名前空間の場合は、バックスラッシュ文字「\」を使用する必要があります。
注意:誤解を避けるため、文字列内でこの文字を使用する場合はエスケープする必要があります: "\\"

名前空間は相互に入れ子にすることができます。A.php ファイルに追加しましょう。
そしてインデックスには次のように書きます。

重要な点は、インポートされたスペースにエイリアスを使用することです。 A\subA::say(); と書くこともできます。 毎回スペースへのフルパスを記述するのは難しいことに同意されるでしょう;これを避けるために、エイリアスが導入されました。 コンパイル時に次のことが起こります。エイリアス sub の代わりに A\subA が置き換えられるため、呼び出し A\subA::say(); が取得されます。

では、グローバル空間で定義された関数を呼び出すとどうなるでしょうか? PHP はまず、現在作業しているスペース内で関数を探します。見つからない場合は、グローバル スコープに移動します。 グローバル関数を使用していることをすぐに示すには、関数の前にバックスラッシュを付ける必要があります。

スペースからクラスを自動ロードする際の問題を回避するには、ファイル システムをスペースの編成と同様に編成する必要があります。 たとえば、ルート フォルダー クラスがあり、そこにクラスが保存され、スペースは次のように編成できます。
クラス\A\A.php
classes\A\sub\A.php (サブサブスペースは別ファイルに配置されます)
クラス\B\B.php

PHP には、現在のスペースの名前を含むマジック定数 __NAMESPACE__ があります。

次にオートロードについてです。

以下のクラスは私のものではありません。ここから引用して、機能させて少し改良しただけです。
注意:クラスをロードするには、クラス名がファイル名と一致する必要があります。

「 .$file 」 in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); Break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) Closedir($handle); ) ) プライベート静的関数 StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
ロードのために取り込まれるクラスの名前を見ると、各クラスの前に、使用中に指定されている名前空間の接頭辞が付いていることがわかります。 これが、名前空間に似たディレクトリ内のファイルの場所を使用することをお勧めする理由です。これにより、検索が 1 回または 2 回の繰り返しで高速化されます。

これで、インデックスは次のように記述できます。
これで、使用するすべてのクラスとインターフェイスが自動的にロードされます。

スペースを使用した言語の動的機能の一部を示すために、別のクラスを宣言してみましょう。
テスト.php

インデックス.php
SayName("テスト"); // または、これを行うこともできます test\sayName("test2"); // または次のように $obj::sayName("test"); // あるいは、これを行うこともできます test::sayName("test2");

私の記事が誰かの役に立てば幸いです。

変数は値を定義しますが、別の変数への参照となり、その値を持つ場合もあります。 アルゴリズムの実行中、変数は通常、さまざまな値をとります。 定数には値が 1 つだけ格納されます。 オブジェクトは予測不可能です。オブジェクトには構造、内容、および多くの機能がある傾向があります。

ネームスペースは、開発者によって作成された変数、定数、オブジェクト、関数、およびその他の構成要素のコレクションであり、このネームスペースの名前を通じて参照できます。

名前: データとアルゴリズムの記述領域

要素 (変数、定数、オブジェクト、関数、その他の開発者構成要素) の名前が交差することはありません。 PHP は名前の一致を重大なエラーとして解釈し、問題を明確に特定できない場合、開発者は意図したとおりに動作しないコードを受け取るか、ブラウザーにホワイト ボックスが表示されます。

スペースはグローバルであるため、すべてのデータのすべての名前は一意である必要があります。 オブジェクトと関数の名前も繰り返すべきではありませんが、グローバル可視性の範囲はオブジェクトと関数のメソッド本体で中断されます。 独自のローカル名前空間があり、外部で指定するのと同じ方法で内部で名前を付けることを妨げるものはありません。

名前空間キーワードに注意を払わなければ、上記の例は典型的なものであり、すべてがいつもどおりです。 2番目には作品が含まれます。 関数名の前の NameSpaceTwo\ 接頭辞は、コードがどの挿入から取得されるかを指定します。

最初の関数 $iExt = 1; からグローバル キーワードと演算を削除すると、 上の行に移動すると、最初の関数も 2 番目の関数も変数 100 の値を知りません。

名前空間: 複数の記述範囲

示されている例には、2 つの挿入を使用する共有ファイルがあります。 各挿入には同じ scCheckName() 関数があります。 どちらを選択するかは、プログラマが、コード内の適切なタイミングで適切な場所に関連するスペースの名前を使用して決定します。

(挿入をマージした後) 共通コード内に同じ名前が存在しても、エラーは発生しません。これは、各挿入ファイルが独自の一意の名前でマークされているという単純な理由によるものです。

最初のファイルでは、そこに記述されるすべての内容が NameSpaceOne という名前に関連付けられています。 2 番目のファイルでは、すべての説明が NameSpaceTwo という名前に関連付けられます。

両方のファイルで名前の重複は許可されますが、それぞれの要素名 (変数、定数、オブジェクト、関数) は一意である必要があります。

この例では、scCheckName() 関数呼び出しで名前空間名を変更すると、2 番目の名前空間の $iExt 変数が変更されなくなりました。 この例では、「変更された」という単語が特別に強調表示されているのはこのためです。変更は実際には行われていません。 変数の値は変わりません。

テストと複数の設計

これらの簡単な例は、複雑なプロジェクトの開発を簡単に簡素化し、効率と生産性を高め、作業をスピードアップできることを示しています。 確かに、名前空間を使用するための最初のアイデアはすぐに浮かび上がりました。

  • スクリプトの安全なテスト - 「作業」スペースをテスト類似物に置き換えることによって。
  • 大規模な開発者チームによる安全な設計 - 要素を記述するための「個別の」スペースを開発者チームに提供します。

実際には、名前空間の方がはるかに重要です。 PHP 言語、名前空間、および記述の各要素 (変数、定数、オブジェクトなど) は、長い間、開発者に構文とセマンティクスを個別に操作する機能を提供してきました。

言語構造と最新のプログラミングの一般規則: 「理解」 - 実行 - 矛盾がある - 「白い画面」はプロの開発者には影響を与えません。

多くのプログラマーは、ブラウザーに何も表示されない (空白の白いボックス) 場合、PHP エラー メッセージをどこで探せばよいのかさえ知りません。 開発の特定の段階で、プログラマは PHP の構文とセマンティクスで考え、自動的に「動作」し、その結果、許可されている範囲内で独自の構文とセマンティクスが得られます。

白い画面はプロのプログラマによる即座の明確な反応であり、エラーは解消されます。 デバッガーを使用したり、エラー ログを表示したりして時間を無駄にする必要はありません。

オブジェクト、配列、名前空間

変数、定数、関数は過去のものであると言えますが、オブジェクトの設計では使用されています。 良いコードとは、アルゴリズムが一連の正しい構成ではなく、相互作用するオブジェクトによって表現されている場合です。

オブジェクトの配列を使用し、スタックの概念と配列の最後の (最初の) 要素を操作すると、ダイナミクスを得ることができます。オブジェクト自体が、現在の状況に応じてサイトの機能がどのように機能するかを「決定」します。 。

PHP では、ネームスペースは特別な種類の変数であり、独自の一意の名前 (多くの場合複雑な名前) で表されます。 名前空間名はコード内で使用されます。 これが文字列の場合は、スクリプトの実行中にスペースを別のスペースに置き換えることができます。

PHP が名前空間名を変数値として使用する場合、これはオブジェクトの配列よりもさらに強力な意味論的に読み込まれる構文になります。

オブジェクトとは、統一性を特徴とする構造と内容です。 名前空間は、オブジェクト、要素、およびそれらの間の関係のセットです。

実行中のシステムで実験を行うことはできませんが、名前空間のおかげで、PHP は次の目的で、別の空間で実際の実行中のシステムをシミュレートする機能を提供します。

  • さらなる発展。
  • テスト;
  • メンテナンスなど

PHP 開発者が提案した構文を抽象化し、名前空間をグローバルで複雑なオブジェクト システムとして想像すると、可能性の範囲は何倍にも広がります。

名前空間の構文と使用法

PHP は、各ファイルのコードの最初の行にある単語の名前空間のみを受け入れます。 すべての説明はこれにのみ従う必要があります。 構文には、通常の名前の意味で示される名前のみが含まれます。

意味を伝える正しい言葉を使うことが重要です。 名前は長い方が良いですが、どのような空間について話しているのか、それが何をするのか、何を説明するのか、何を受け入れるのか、何のために作成されたのかを明確に理解できるものが含まれています。

スペースは無制限にネストできますが、過度に使用しないでください。 名前は明確でなければならず、ネストは正当化されなければならず、スペース名のシーケンスにはロジックがなければなりません。

使用および名前空間アプリケーションでは、PHP では複雑なコーディングが可能ですが、可能な限り単純なオプションを使用することをお勧めします。

一般的なルールは次のとおりです。ネームスペースは説明であり、これは 1 つのファイルであり、use はスペースを use スクリプトにインポートし、エイリアス (短いリンク) を割り当てます。

クラス (オブジェクト) を自動ロードする簡単な例

タスクには、文字列、ページ要素スタイル (CSS 記述)、日付オブジェクト、ファイル システム オブジェクト、およびデータベース オブジェクトを操作するためのオブジェクトが含まれています。 実装のポイントは、これらのオブジェクトのメソッドを通じてのみ必要な機能を使用できるように、これら 5 つの位置に単純なインターフェイスを作成することです。

言語関数や構成要素を直接使用することは許可されません。 このタスクでは、PHP クラスの自動読み込みを使用します。 ネームスペースは、ファイル システム内の特定の場所にあるオブジェクトのコレクションと見なされます。 通常、すべてのオブジェクトは、その意味に従ってファイル システム内、特定の名前のフォルダーおよびファイル内に配置されます。

左側のコードは、必要な 5 つのオブジェクトの作成を示していますが、それらが正確にどこに配置されるかは示されていません。 右側のコードは、クラス (オブジェクト) をロードするときに、オブジェクトの場所への必要なパスと .php ファイル拡張子を自動的に置き換えるオートローダー (メイン スクリプト) のテキストを示しています。

複数の名前空間の例

PhpOffice/PhpWord ライブラリは、複数の名前空間の複雑な階層を使用する良い例です。 要素フォルダーには、*.docx ドキュメント (MS Word) を作成するときに使用できる要素のほぼ全範囲が含まれており、他のフォルダーには要素、段落、表を操作するために必要なツールが含まれています。

実際、このライブラリは、PhpOffice / PhpWord の機能スペースを特定のツールで補完し、最終的には同様の製品の独自バージョンを作成する必要があるという理由で、プロジェクト フォルダーに配置されました。

異なる名前空間の多くのクラスをロードする

多くのクラスをロードする必要があり、開発されたオブジェクトのシステムの階層が非常に複雑で想像するのが難しい場合に、PHP 名前空間の自動ロードを使用すると、厳格な構造を作成する必要が生じます。

開発者の方向性 (製品を使用して作業を継続する人) は、オブジェクトの本当の意味と関係を反映する単語の適切な組み合わせによって表されるセマンティクス (プロジェクトの理解) のコンテキストでのみ可能です。

個々のプロジェクトでライブラリを使用する必要があるため、開発者と PhpOffice / PhpWord 作成者の名前空間をどのように組み合わせるかという問題の解決につながります。 最良の方法は、この製品 (そのスペースとオブジェクト) を独自のプロジェクト スペースに配置することです。

この製品の名前空間をその抽象要素とクラスのロードのレベルで変更せずに行うことはできないことに注意することが重要です。 これは、PHP 名前空間では、内部名前空間の使用が十分に抽象的かつ普遍的ではない可能性があることを示しています。

ファイルシステムとスペースのローカリゼーション

基本的に、ネームスペースは、ファイル システム内の目的のオブジェクトへのパスの「概要」です。 ファイル名をオブジェクト名として使用するのは自然で一般的です。 名前空間の命名としてフォルダー名を使用することは目的を達成します。

情報の「木製」組織は使用するのが非常に難しく、開発を複雑にしますが、オブジェクトのシステムにとっては自然な表現です。

問題は、開発段階が、フォルダーの表示表現と特定のフォルダーのコンテンツの両方を組み合わせる特定のコード エディターによって表されることですが、オブジェクト間およびオブジェクト間のエンドツーエンドの移動を提供するエディターがまだ存在しないことです。フォルダー。

抽象性と普遍性の問題

開発者の意識と現実の目的によって受け入れられる:

  • 抽象化と、実際のセマンティクスに従って情報を操作する機能を提供します。
  • ネームスペースは、ファイル システム内のスクリプト、オブジェクトの位置、およびプロジェクトの意味の一部を反映します。

実際、OOP 抽象化をオブジェクト名 (ファイル) に接続し、それを適切な名前空間形成 (パス + 名前) でファイル システム (フォルダー) にオーバーレイすることで、スクリプトの実行中に名前空間の形成を制御できます。

プログラミングはすでに開発の強力なダイナミクスを獲得していますが、開発段階のプロセスと負荷をテキスト エディター (スクリプトが作成され、フォルダー ツリーに配置される) からコードを生成するというアイデアに移すと、それ自体を改善し、ファイル システム内の適切な場所に配置することができます。プログラミングは新たな高みに到達します。