【PHP】オートロードの使い方!requireを使わずに自動的に読み込む方法

WEB

PHPでプログラムを作成した際、外部ファイルを「require_once」で1つ1つ呼び出すのって面倒じゃありませんか?
少し前まで僕は1つ1つ「require_once」で呼び出していたのですが、ファイル数が増えてくると

require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php
require_once ファイル名.php

こうなっちゃうんですよ。「require_once」だけで100行は消費できそうな勢いです。もうとにかく面倒!長ったらしい!つらい!

ということで、そんな「require_once」の悩みを解決してくれるのが、PHPが標準搭載しているオートロードという機能です。
その名の通り、必要な外部ファイルを自動でロードしてくれます。「require_once」を記述する必要もありません。便利です。

オートロードの簡単な使い方

オートロードには「spl_autoload_register()」という関数を使います。

(余談:正確にいうとオートロードには「__autoload」という関数を使うのですが、「__autoload」だけだと不便な点があるので「spl_autoload_register()」を使おうというわけです。まぁ細かいことはあまり気にしなくても大丈夫。)

下記のサイトを参考にさせていただきました。ありがとうございます。ありがとうございます。ありがとうございます。
PHPでクラスをspl_autoload_registerを使ってオートロードする - バカンス駆動開発

class AutoLoader {

protected $dirs;

public function register() {
spl_autoload_register(array($this, 'autoLoad'));
}

public function registerDir($dir) {
$this->dirs[] = $dir;
}

public function autoLoad($className) {
foreach ($this->dirs as $dir) {

/* ここから私が独自に追加したもの */
$className = str_replace("_", "-", $className);
$className = mb_strtolower($className);
/* ここまで */

$file = $dir . '/' . $className . '.php';
if (is_readable($file)) {
require $file;

return;
}
}
}

}

$autoLoader = new AutoLoader();
$autoLoader->registerDir('ここに追加したいパスを書く');
$autoLoader->registerDir('ここに追加したいパスを書く');
$autoLoader->registerDir('ここに追加したいパスを書く');
$autoLoader->register();

まず、上記のクラスをどっかにコピペします。私は「loader.php」というファイルにコピペして、index.phpからrequireしました。とりあえず読み込まれてさえいれば何でもオッケーです。
次に「ここに追加したいパスを書く」の部分に、「require_once」したいファイル群が入ったフォルダパスを指定しましょう。

これだけでOK。

あとは普通にクラスのインスタンスを生成するだけです。「require_once」でクラスファイルを読み込んでいなくても動作するはずです。

<?php
$sample = new SAMPLE;
$sample->test();
?>

注意点として、クラス名とファイル名が同じでなくてはいけないというルールがあります。
たとえば「Test.php」というファイルには「Test」という名前のクラスを定義するという風にね。

僕の場合、開発の都合上クラス名とファイル名が異なっていた為、一部ソースコードを追加しました。
「/* ここから私が独自に追加したもの /」という部分です。
ファイル名が「test-sample.php」クラス名が「Test_Sample」という感じで微妙に異なるので、「/
ここから私が独自に追加したもの */」という部分で変換をかけています。まぁこれは各自自由に工夫すればいいと思います。


Category
9WEB