0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】composerと名前空間、オートロード

Posted at

PHPにおいて、名前空間オートロードの仕組みは開発効率に大きく影響するということで、実際にこれらを使って簡単にコードを書いてみようと思います。

コードを書いていく

composerを使うには、composer.jsonという設定ファイルをあらかじめ準備しておく必要があります。
今回はターミナルから作成しようと思うので、composer_practiceというフォルダを用意して、その中で以下のコマンドを実行します。

ターミナル
composer init

コマンド実行後にエディタに移動すると、フォルダの中にcomposer.jsonというファイルが生成されています。

composer.json
{
    "name": " ~ /composer_practice",
    "authors": [
        {
            "name": " ~ ",
            "email": " ~ "
        }
    ],
    "require": {}
}

このファイルを、オートロードができるように書き換えます。

composer.json
{
    "autoload": {
        "psr-4": {
            "App\\" : "app/" //appが実際のフォルダ、Appがnamespace
        }
    }
}

appとしたので、composer_practiceフォルダ内にappというフォルダを作成すれば、そのフォルダからがオートロードの対象になり、名前空間としてはAppからスタートします。
ファイルを作成したら、ターミナルで以下のコマンドを実行してcomposerをインストールします

ターミナル
composer install

実行後、composer_practiceフォルダ内にvendorフォルダが新しく生成されていて、その中にオートロードファイルがあります。composer.jsonで設定した内容に従って、vendorフォルダの中がインストールされるという訳ですね。

次に、appフォルダ内にModelsフォルダとControllersフォルダを作成して、Modelsフォルダ内にはTestModel.phpファイルを、Controllersフォルダ内にはTestController.phpファイルを作成します。
そして、それらのファイルを呼び出すためのcall.phpファイルも準備します。

ディレクトリ構成図
composer_practice
      ├ composer.json
      ├ composer.lock
      ├ vendor
      ├ call.php
      └ app
         ├ Controllers
         │    └ TestController.php
         └ Models
              └ TestModel.php

まずTestModel.phpにコードを書いていきます。

TestModel.php
<?php

namespace App\Models;

class TestModel {

  private $message = 'hello world';

  public function getHello() {
    return $this->message;
  }
}

名前空間はフォルダと同じような構成になります。
それから、クラスの名前をファイル名と同じにする必要があります。なので1ファイルに対して1クラスという関係になります。

次にTestController.phpです。

TestController.php
<?php

namespace App\Controllers;

use App\Models\TestModel;

class TestController {
  public function run() {
    $model = new TestModel;
    echo $model->getHello();
  }
}

useキーワードを使い、use App\Models\TestModel;と記述することで、クラスをインポートしています。

最後にcall.phpです。

call.php
<?php

require_once __DIR__ . '/vendor/autoload.php';

use App\Controllers\TestController;

$app = new TestController;
$app->run();

__DIR__と記述すると、この定数が呼び出されたファイルがあるディレクトリのフルパスを返してくれます。
実行結果は以下です。しっかり表示されました。

hello world

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?