【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

[FuelPHP 1.7] Autoloaderクラスを拡張する

PHP

WEBチームの日下部です。

FuelPHP 1.7 で Autoloader クラスを拡張する方法で悩んだので書き記します!

 

やりたいこと

\Fuel\Core\Autoloaderクラスを拡張し、Autoloaderクラスとして定義する

 

FuelPHPのコアクラスを拡張するやり方は

http://fuelphp.jp/docs/1.7/general/extending_core.html (FuelPHP 1.7)

ここに書かれている通りです。

拡張するのが Autoloader ではなく、例えば Response クラスなら簡単です。

1
class Response extends FuelCoreResponse { }

を app/classes/response.php として保存し、app/bootstrap.php のadd_classesにクラス名とファイルパスの対応を書き込めばokですね。

1
2
3
Autoloader::add_classes(array(
    'Response' => APPPATH.'classes/response.php',
));

ところがこれと同じ手順でAutoloaderを拡張しようとしてもうまくいきません。
なぜですか? Autoloaderだけは例外だからだ!

 

悩んだところ

さっきのドキュメントの一番下にこう書かれています。

Autoloader

The Autoloader class is a special case, you can only extend it once as [Autoloader] and have it used. After extending it you have to require it manually in the [app/bootstrap.php] file after the original [FuelCoreAutoloader], don't forget to remove the line that aliases the core class to global.

すなわちこういうことです。

 

  1. FuelCoreAutoloader を拡張した Autoloader クラスファイルを app/bootstrap.php 内で手動で require する
  2. remove the line that aliases the core class to global (???)

 

1つめはわかる! こうすればいい。

app/classes/autoloader.php を作成して、

1
class Autoloader extends FuelCoreAutoloader { }

app/bootatrap.php の冒頭に

1
require APPPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';

を記述。

 

2つめの意味がわからなかった! わからなかったので無視してページを開いてみると

Cannot redeclare class Autoloader

こっからしばらく悩みましたが解決しました。

結論から言うと、 public/index.php の50行目付近

1
class_alias('Fuel\Core\Autoloader', 'Autoloader');

これをコメントアウトすればokです。

 

この行の意味するところは

「グローバル名前空間の Autoloader から、名前空間 FuelCore 内の Autoloader へのエイリアスを張る」

です。(class_alias() については http://php.net/manual/function.class-alias.php を参照)

このエイリアスがあったために、

1
class Autoloader extends FuelCoreAutoloader { }

とすると、Autoloader を二重定義かつ自分自身を継承という事態になっていました。

 

 

まとめると、

コアクラスの Autoloader を拡張するときは

  1. app/classes/autoloader.php を作成
    1
    class Autoloader extends FuelCoreAutoloader { }
  2. app/bootstrap.php の冒頭に
    1
    require APPPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';

    を記述

  3. public/index.php (50行目付近)の
    1
    class_alias('Fuel\Core\Autoloader', 'Autoloader');

    をコメントアウト

の3点を抑えればokです。お後がよろしいようで。

 

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
2,005
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author