PHP require_onceを使わない、 autoloadを使ってクラスを読み込む方法 

私、恥ずかしながら…。(*ノωノ)

今までPHPをやっていて、autoloadという仕組みがあることは知っていましたが、ライブラリを読み込むときとかに使うぐらいでちゃんと自分で使えていませんでした。

ただ、今回あるプロジェクトを見ていて、PHPUnitがrequire_once地獄になっておる…(´ω`) と思い、どうにかしたく、autoloadに取り組むことにしました。

まず、シンプルなPHPプロジェクトを作ってみます。

環境はWindows10 Pro, PHP7.2.31です。

下記のように、classの下にHogeとMonkeyというクラスがあり、トップディレクトリにhoge.phpがあります。

hoge.phpの初期状態はこんな感じです。

<?php

echo "ほげだよ<br>";

$monkey = new Monkey();
$monkey->scream();

class/Monkey.phpの初期の中身はこんな感じです。

<?php

class Monkey
{

    public function scream(){
        echo "ウキー!!!";
    }
}

autoloadを導入するにあたり、まず必要なのはcomposerです。

composerのインストールなどは、こちらなどをご覧ください。
ここではcomposerは普通に使えるものとして進めます。

composer.jsonを次のように作ります。

{
  "autoload": {
    "psr-4": {
      "MonkeyWorld\\": "class/"
    }
  }
}

composer install

をします。

私はPHP Stormを使っていて、PHP StormではcomposerのコマンドをPHP Stormから使えるようになってるので、次の赤丸の箇所をポチリとやるだけです。便利!✧٩(ˊωˋ*)و✧

そうすると、下記のようにvendorというディレクトリができて、autoload〇〇ってファイルたちもできてますね。

composer.jsonに書いた記述の内容は、classというディレクトリ以下が”MonkeyWorld というnamespaceになって自動的に読み込みができるという内容のはずです。

hoge.phpを次のようにします。

<?php

use MonkeyWorld\Monkey;
echo "ほげだよ<br>";


$monkey = new Monkey();
$monkey->scream();

Monkeyクラスを次のようにします。

<?php
namespace MonkeyWorld;

class Monkey
{

    public function scream(){
        echo "ウキー!!!";
    }
}

上記のコードでは、namespaceを追加したんですね。

これでhoge.phpからMonkeyクラスが読み込めそうじゃないですか。

しかし、結果は

( ! ) Fatal error: Uncaught Error: Class ‘MonkeyWorld\Monkey’ not found in D:\xampp\htdocs\autoloadSample\hoge.php on line 7
( ! ) Error: Class ‘MonkeyWorld\Monkey’ not found in D:\xampp\htdocs\autoloadSample\hoge.php on line 7

となってしまいます。(>_<)

私、これautoloadのつまづきポイントだと思うんですけどね。

そりゃ、autoload.phpを読み込んでないんですもんね。なんの恩恵もないわけですよ。

<?php

require_once "vendor/autoload.php";

use MonkeyWorld\Monkey;
echo "ほげだよ<br>";


$monkey = new Monkey();
$monkey->scream();

上記のファイルでは

require_once "vendor/autoload.php";

が追加になっています。

ブラウザから実行すると、次のように表示され、うまくいきました!

次に例えば、Chimpanzeeクラスを追加します。

<?php
namespace MonkeyWorld;

class Chimpanzee
{

    public function scream(){
        echo "おいらチンパンジー。";
    }
}

これも、次のようにやるとちゃんと表示されます。

<?php

require_once "vendor/autoload.php";

use MonkeyWorld\Monkey;
use MonkeyWorld\Chimpanzee;

echo "ほげだよ<br>";


$monkey = new Monkey();
$monkey->scream();

$chimpan = new Chimpanzee();
$chimpan->scream();

ブラウザから実行すると、次のようになります。

よかった✧٩(ˊωˋ*)و✧

ちなみに、たとえばMonkeyクラスのファイルをmonkey.phpなどとしている場合があると思います。そうすると、Linuxだと読み込めなかったりするみたいです…。(自分が遭遇したわけではないので参考までですが)

https://stackoverflow.com/questions/41784405/need-to-dump-autoload-to-everytime-i-add-a-new-class

autoload使う場合は、クラス名と同じファイル名にする必要がありますが(例えばここでは、MonkeyクラスはMonkey.php)、大文字小文字も同じにした方がよいでしょう。

PHPUnitで使う話は?となりますが、長くなったので次回へ続きます!

次回はこれ↓

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です