共通処理クラスを作りたい場合にどうしてますか?

5,883 views
Skip to first unread message

kazuki endo

unread,
Mar 15, 2012, 10:18:53 PM3/15/12
to fuelphp.jp
こんにちは、半年前くらいにfuelphpを知り色々触らせていただいています。

皆さんは独自の共通の処理をまとめたクラスなどを作る時はどのような構成にしていますか?

以下の事を行いたいです。
■効率よく読み込みたい
■出来るだけfuelphpの機能を利用したい

個人的に調べた結果ですとAutoloaderにオリジナルのクラスを追加してみたり、
always_loadを使ってみましたが、思ったようにいきません。

よろしくお願いいたします。

HiroKws

unread,
Mar 16, 2012, 12:02:51 AM3/16/12
to fuelp...@googlegroups.com
こんにちは

もうちょっと、情報を出さないと、皆さん回答しづらいと思いますよ。

まず、「共通」ですが、他の人と開発をしていて、汎用の処理を共有したいのですか?それとも、自分だけで開発しているのだけれど、頻繁に利用するコードをまとめたいということでしょうか?

もう一つ、「効率」という言葉ですが、人によって受け取り方が違ってしまうので、具体的に何を求めているのか、明確に記述すると、回答者もポイントを押さえて、お答えできるのではないでしょうか?例えば、速度やメモリ使用量のために、実行効率を求めているのですか?それとも、コーディングの手間を出来るだけ省きたいという意味でしょうか?また、開発効率のことですか?それとも、コーディング量を減らしたいという意味でしょうか?

さらに、思ったようにいってないとのこと。何が達成されれば、「思ったように」になるのか、説明を加えたほうが、いいでしょう。今まで、どういうことを行って、こうなったから上手く行かなかったと、具体的に行ったことを書くと、読み手の手助けになります。

ML Hirohisa Kawase

kazuki endo

unread,
Mar 16, 2012, 5:15:45 AM3/16/12
to fuelphp.jp
HiroKwsさん ご回答ありがとうございます!

すみません質問などの投稿がはじめてでして足りない所が多々あるかと思いますが、
お教えいただけますと幸いです。

■共通について
自分一人で開発をしていて頻繁に利用する関数などをまとめたいです。

■効率について
fuelphpの機能で上記の事を実現できる機能があれば使いたいです。
自分でfuel/app/libs/hoge.phpなどを作ってrequireせずに済むこととプログラムの実行速度が早い方法が知りたいです。

結果としては自分一人で利用する際に頻繁に利用する関数などを実行速度を考慮して実装したいです。

すみません、こちらで分りますでしょうか。
よろしくお願いいたします。

HiroKws

unread,
Mar 16, 2012, 6:46:14 AM3/16/12
to fuelp...@googlegroups.com
文面からしますと、他の言語(コンパイル言語)の経験をお持ちなのでしょうか?スクリプト言語は初めてですか?

私はPHPの専門家でも、開発者でもありませんから、一般的な回答になります。

PHPのようなスクリプト言語ですので、ソースを実行時に読み込まず、実行することはできません。直接的にrequireやinclude文を使おうと、使わまいと、何らかの方法でコードが読み込されるのには、変わりありません。読み込まなければ実行できません。

もし、お仕事で使用し、高速化が必要だということであれば、PHPの実行環境にアクセレーター(実行前のコンパイルした中間コードをキャッシュしておく)を採用するとか、プリコンパイラーやオプティマイザを備えた環境の製品を採用するという手段もあります。(私は、専門家でありませんので、詳細はご自身で調査してください。FuelPHPという範疇ではなく、PHP自体のお話になります。)

プログラム自体の高速化に関してはPHP+高速化で検索をかければ、情報は得られると思います。

あとは、共通に使用する(多分)functionをどう設計するかという問題でしょう。例えば、hoge.phpに100個の関数をまとめ、それを毎回読み込み、実際に使うのは100個のうち2,3個であれば、ソースの読み込みと、実行前のコンパイルに余計な時間がかかります。

では逆に、100個を全部、一つ一つ細かく分けたのでは、今度は読み込む際のオーバーヘッドが余計にかかることになります。特にFuelPHPを始め、最近のフレームワークは、include/requireを書かなくても済むように、オートロードの仕組みを採用しているため、オーバーヘッドは素のPHPでinclude/requireするよりも多少大きくなります。

但し、通常の開発では、このように速度を考えてクラス設計することはあまりありません。クラスを適切に設計するほうが、重要視されます。

それと、大抵のアプリではPHPのみ実現できる機能は少なく、DBを使用するでしょう。大抵の場合、DBまわりに使われる時間のほうが、コードの読み込みにかかる時間よりもかなり大きくなるため、コードの読み込みの効率化は、優先度は低いです。コードはわかりやすく、クラスも適切に設計するほうが重要視されます。

速度が問題であれば、もっと軽い(仕組みが単純な)フレームワークを採用するか、素のPHPでコーディングするのが、よろしいのではないでしょうか。もしくは、最近はあまり流行っていないようですが、javaや、C++などのコンパイル言語で開発するかでしょう。

また、コードの読み込みによる高速化にこだわらなければ、FuelPHPには、キャッシュクラスも用意されているので、こうした仕組みを活用する方法もあります。

それでもPHPを使って、コーディングにより、シビアに速度を求めたいのであれば、プロファイラを利用し、実測して、調整することになると思います。多分、FuelPHPが持っているプロファイラもお役に立つでしょうし、また開発環境(IDE)には、プロファイルが取れる機能を持っているものも、多いです。そうした、機能を利用し、遅い部分を見つけ、改善するという、地道に速度を上げる手段を取ることになるのでは、無いでしょうか。

また、FuelPHP自体が読み込むクラスもあります。自分でFuelPHPクラスを呼び出せば、そのクラスが必要な別のクラス、また別のクラスと読み込まれることになります。そうしたコアまわりが読み込むファイルは結構な数にのぼります。オートロードの仕組みがあるため、余計なクラスは読み込まれませんが、自前のライブラリー的コードの一つや二つ、高速化した所で、焼け石に水でしょう。(これも、プロファイルを見てもらえば分かります。)

一般的な話になってしまいました。他の方の意見も、参考にしてください。

ML Hirohisa Kawase

kazuki endo

unread,
Mar 16, 2012, 8:02:22 AM3/16/12
to fuelphp.jp
文面に誤解があったようです。
すみませんでした。

以下で書かれているオートロードの仕組みのについて導入方法が知りたいです。
公式ドキュメントを見ても理解できませんでした。

> では逆に、100個を全部、一つ一つ細かく分けたのでは、今度は読み込む際のオーバーヘッドが余計にかかることになります。特にFuelPHPを始め、最近のフレームワークは、include/requireを書かなくても済むように、オートロードの仕組みを採用しているため、オーバーヘッドは素のPHPでinclude/requireするよりも多少大きくなります。


公式ドキュメントを見ると
Autoloaderやalways_loadで実装出来ないかと思いましたが、実装方法が分りません。

require_once 'hoge/functions.php';

↓ 下記に代替できないか?

/app/bootstrap.php
Autoloader::add_classes(array(
'hoge' => APPPATH.'classes/functions.php',
));

よろしくお願いいたします。

Kenji Suzuki

unread,
Mar 16, 2012, 8:22:25 AM3/16/12
to fuelp...@googlegroups.com
Kenji です。


On Fri, 16 Mar 2012 05:02:22 -0700 (PDT)
kazuki endo <endou...@gmail.com> wrote:

> 文面に誤解があったようです。
> すみませんでした。
>
> 以下で書かれているオートロードの仕組みのについて導入方法が知りたいです。
> 公式ドキュメントを見ても理解できませんでした。
>
> > では逆に、100個を全部、一つ一つ細かく分けたのでは、今度は読み込む際のオーバーヘッドが余計にかかることになります。特にFuelPHPを始め、最近のフレームワークは、include/requireを書かなくても済むように、オートロードの仕組みを採用しているため、オーバーヘッドは素のPHPでinclude/requireするよりも多少大きくなります。

fuel では、app/classes/ 以下にクラスファイルを置けば、オートロードされます。
ファイル名はクラス名を全部小文字にします。フォルダ区切り文字は _ にします。

app/classes/hoge/functions.php

なら、

class Hoge_Functions {}

となります。

ちなみに関数は使いません。全部クラスです。


> 公式ドキュメントを見ると
> Autoloaderやalways_loadで実装出来ないかと思いましたが、実装方法が分りません。


> require_once 'hoge/functions.php';
>
> ↓ 下記に代替できないか?
>
> /app/bootstrap.php
> Autoloader::add_classes(array(
> 'hoge' => APPPATH.'classes/functions.php',
> ));

これはできそうですが、動きませんでしたか?


// Kenji

HiroKws

unread,
Mar 16, 2012, 8:25:11 AM3/16/12
to fuelp...@googlegroups.com
http://press.nekoget.com/fuelphp_doc/general/classes.html

app/classesの下に、クラス名の命名ルールに従って、配置するだけです。オートロードは実装されています。

http://press.nekoget.com/fuelphp_doc/general/extending_core.html#extend_and_replace

Autoloader::add_classes(array(..に関しては、コアクラスの置き換えの話しでないでしょうか?

ここまで、書いている途中でkenjiさんが投稿したようですので、後ひとつだけ。

それともhogeディレクトリーをオートロードの検索パスに加えたいということでしょうか?

kazuki endo

unread,
Mar 16, 2012, 8:36:32 AM3/16/12
to fuelp...@googlegroups.com
目的の内容が実現できました!
ありがとうございます。

 

> require_once 'hoge/functions.php';
>
> ↓ 下記に代替できないか?
>
> /app/bootstrap.php
> Autoloader::add_classes(array(
>         'hoge' => APPPATH.'classes/functions.php',
> ));

> これはできそうですが、動きませんでしたか?

こちら保存先をclasses/controller/配下に置いておりました。。
ご迷惑おかけしました。

2012年3月16日金曜日21時22分25秒 UTC+9 Kenji Suzuki:

kazuki endo

unread,
Mar 16, 2012, 8:41:43 AM3/16/12
to fuelp...@googlegroups.com
公式ドキュメント情報ありがとうございます。
見ていたのですが、理解できなかったようです。

ありがとうございました。

2012年3月16日金曜日21時25分11秒 UTC+9 HiroKws:

Kenji Suzuki

unread,
Mar 16, 2012, 8:53:17 AM3/16/12
to fuelp...@googlegroups.com
Kenji です。


On Fri, 16 Mar 2012 21:25:11 +0900
HiroKws <hir...@gmail.com> wrote:

> Autoloader::add_classes(array(..に関しては、コアクラスの置き換えの話しでないでしょうか?

これは、クラスとそのファイルのパスをあらかじめ登録することで
ファイル検索の時間をなくし、ロードを高速化するための仕組みだと
思います。

コアクラスの置き換えにも使われますが。

core の bootstrap の add_classes() にずらーっとクラスが
並んでるのは、パフォーマンスのためです。


// Kenji

kazuki endo

unread,
Mar 17, 2012, 4:02:18 AM3/17/12
to fuelp...@googlegroups.com

 

コアクラスの置き換えにも使われますが。

core の bootstrap の add_classes() にずらーっとクラスが
並んでるのは、パフォーマンスのためです。

そうなんですね。例えばclasses/libs/util.phpというファイルを作りましたが、これをbootstrap.phpのadd_classesに加えると
読み込み速度の高速化ができるという事でしょうか。

その下記配列の連想配列名にあたる部分は何を書けばいいのでしょうか?
coreファイルをみるとパスが記述されているのですが。

Autoloader::add_classes(array(
         'View' => APPPATH.'classes/libs/util.php',
));

後1点お教えいただけますでしょうか。
classes/libs/util.phpをclasses/controller/index.phpで以下のように定義していますが他のclasses/controller/hoge.phpなどでも
いちいちLibs_Util::hoge();を呼び出したくありません。
Controller_Templateを継承したクラスを作りそこでロードできますが、出来ればbootstrap.phpのように必ず読み込まれるようにしたいです。

<?php

class Controller_Index extends Controller
{
   public function action_index(){
          Libs_Util:hoge();
   }
}



2012年3月16日金曜日21時53分17秒 UTC+9 Kenji Suzuki:

HiroKws

unread,
Mar 17, 2012, 6:47:39 AM3/17/12
to fuelp...@googlegroups.com
kenjiさんの書いた「パフォーマンス」とは、オートロードの仕組みの効率のことです。

最速の方法は、オートロードを利用せず、自分でinclude/requireを書くことです。余計なオーバーヘッドがかかりません。

クラスを予め読み込みたいのであれば、http://press.nekoget.com/fuelphp_doc/general/configuration.htmlを参考に、always_load.classesを設定したらいかがでしょう。app/config/config.phpで設定します。
多分、コアでなく、自前で作成したクラスも、読み込んでくれたと思います。

kazuki endo

unread,
Mar 17, 2012, 7:46:32 AM3/17/12
to fuelp...@googlegroups.com



ありがとうございます。
Always loadについて、書き方が公式ドキュメントに書かれていないので書き方を教えていただけますでしょうか?
lhh
例:
'classes'  => array(
       'libs/util.php' => null,
 ),
この場合「Always load class does not exist」と出ます。もちろん書き方があっていないので読み込めていないようです。

本家のForum等も見てはいるのですが、普通は迷わない事なんでしょうか。

2012年3月17日土曜日19時47分39秒 UTC+9 HiroKws:
2012年3月17日土曜日19時47分39秒 UTC+9 HiroKws:

HiroKws

unread,
Mar 17, 2012, 8:46:52 AM3/17/12
to fuelp...@googlegroups.com
確かめていませんが、classesですから、クラスの名前をそのまま記述すれば良いのではないでしょうか。提示されているファイル名ですと、"Libs_Util"になると思いますが。

事前にクラスを読み込むことは、FuelPHPでは「普通」あまり行われないかと思います。私はやったことがありません。ですから、すいませんが明確にどうやるかお答えできません。(今のところ、調査するためにテストコードを書くつもりはありません。)
なぜ、私が事前にクラスを読み込まないかといえば、クラスの読み込みの手間をFuelPHPが用意してくれているオートローダーに任せたいからです。FuelPHPを使用する理由の一つだからです。特徴ですね。
そのかわり、オートロードを利用するためには、クラスとファイル名のネーミングルールに従います。

迷わないかという問いについては、迷いますよ。新しいフレームワークです。ドキュメントも完璧ではありませんしね。だから、自分でコードを書いてFuelPHPの特徴とか、癖といったものを体得していくのです。(半年前にFuelPHPを知り、いろいろいじっていると書かれているので、こうした特徴なりは、既に体得できているのだと、思いますが。)

正直、私はkazuki endoさんが、どの程度のスキルをお持ちなのか図りかねています。他のフレームワークを使用した経験があるかないか、PHPの名前空間やクラスの知識はお持ちなのか、どうしてたった一つのコードの読み込み速度を早めることに頑張っているのかという理由がわからないので、何をどの程度まで詳しく書けばいいのか分かりかねています。無駄なコードを読み込まないという点で、オートロードは全体として、実行速度の向上に役だっていますからね。FulePHPが高速なフレームワークである理由の一つです。

何を書けば、kazuki endoさんに理解してもらえるのかわからないので、答えがあっている、間違っているを含め、他の人にタスキをわたします。ギブアップです。

kazu

unread,
Mar 17, 2012, 9:43:58 AM3/17/12
to fuelp...@googlegroups.com
皆様ありがとうございました。
色々と試しておりましたら、目的の動作が得られた為、同様の方の為に書かせていただきます。

独自のクラスを作りコントローラが実行される前に読み込む方法です。

独自クラス作成
fuel/app/classes/hoge.php

confing.phpに独自クラスを追加
fuel/app/config/config.phpの'always_load'の'classes'に以下を記載
'classes'  => array(
                '0' => 'Libs_Util',
)

実際にController_Templateなどより早く実行される事を確認しましたので共有させていただきます。








2012年3月17日土曜日21時46分52秒 UTC+9 HiroKws:
Reply all
Reply to author
Forward
0 new messages