Namespacesの概要
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 10/91。
PHPプロジェクトが大きくなると、多くのクラスを作成することになります。2つのクラスが同じ名前を持っている場合、どうなるでしょうか?
たとえば、ブログ用のUserクラスと、ショップ用の別のUserクラスがあるとします。名前空間は、クラスを論理的なグループに整理することで、この問題を解決します。
namespace はクラスのためのフォルダーのようなものです。PHP ファイルの先頭で、namespace キーワードを使用して宣言します。
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
これで、別の名前空間にもう1つのUserクラスを持つことができます。
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
namespace付きクラスを使用するには、backslashを使用してfull pathで参照します。
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
出力:
Alice
alice@example.com
backslash \は、ファイルのpathでスラッシュがフォルダーを分けるのと同様に、namespaceの階層を分けます。より深く整理するために、App\Models\Blogのような入れ子のnamespaceを作成することもできます。
重要なポイント: namespace は名前の競合を防ぎ、コードを整理して保ちます。ファイル内の他のコードより前に、必ず namespace を宣言してください(declare 文を除く)。
チャレンジ
簡単同じ名前のクラス間での名前の競合を防ぐため、namespace を使用して小さなアプリケーションを整理しましょう。
車両と動物の両方を扱うシステムを構築していると想像してください。どちらの領域にも Car というエンティティがあります。一方は実際の自動車を表し、もう一方は "Car" という名前のペットの猫です(そうです、そのように猫に名前を付ける人もいます!)。
3つのファイルを作成します。
Vehicle/Car.php:Vehiclenamespace にCarclass を Define し、public $brandproperty を持たせます。constructor はブランド名を accepts して設定する必要があります。"Vehicle: [brand]"を returns するdescribe()method を Add します。Animal/Car.php:Animalnamespace にCarclass を Define します(これは Car という名前の猫です!)。public $ageproperty を持たせます。constructor は年齢を accepts して設定します。"Cat named Car, age: [age]"を returns するdescribe()method を Add します。main.php:require_onceを使用して両方の class files を Include します。それぞれの namespace から full namespace path を使用して1つずつ object を作成し、各 object に対してdescribe()を呼び出した result を出力します(それぞれ別の line に出力します)。
main.php で、次のものを作成します。
- brand が
"Toyota"のVehicle\Car - age が
3のAnimal\Car
object を作成するとき、full path を使って namespaced classes を参照するには backslash \ を使用することを Remember してください。
自分で試してみよう
<?php
// クラスファイルをインクルードする
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: ブランド "Toyota" の Vehicle\Car オブジェクトを作成する
// バックスラッシュを使った完全な名前空間パスを使用することを忘れないでください
// TODO: 年齢 3 の Animal\Car オブジェクトを作成する
// バックスラッシュを使った完全な名前空間パスを使用することを忘れないでください
// TODO: 各オブジェクトの describe() の結果を出力する(それぞれを別の行に)
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ