もうちょっと、情報を出さないと、皆さん回答しづらいと思いますよ。
まず、「共通」ですが、他の人と開発をしていて、汎用の処理を共有したいのですか?それとも、自分だけで開発しているのだけれど、頻繁に利用するコードをまとめたいということでしょうか?
もう一つ、「効率」という言葉ですが、人によって受け取り方が違ってしまうので、具体的に何を求めているのか、明確に記述すると、回答者もポイントを押さえて、お答えできるのではないでしょうか?例えば、速度やメモリ使用量のために、実行効率を求めているのですか?それとも、コーディングの手間を出来るだけ省きたいという意味でしょうか?また、開発効率のことですか?それとも、コーディング量を減らしたいという意味でしょうか?
さらに、思ったようにいってないとのこと。何が達成されれば、「思ったように」になるのか、説明を加えたほうが、いいでしょう。今まで、どういうことを行って、こうなったから上手く行かなかったと、具体的に行ったことを書くと、読み手の手助けになります。
ML Hirohisa Kawase
すみません質問などの投稿がはじめてでして足りない所が多々あるかと思いますが、
お教えいただけますと幸いです。
■共通について
自分一人で開発をしていて頻繁に利用する関数などをまとめたいです。
■効率について
fuelphpの機能で上記の事を実現できる機能があれば使いたいです。
自分でfuel/app/libs/hoge.phpなどを作ってrequireせずに済むこととプログラムの実行速度が早い方法が知りたいです。
結果としては自分一人で利用する際に頻繁に利用する関数などを実行速度を考慮して実装したいです。
すみません、こちらで分りますでしょうか。
よろしくお願いいたします。
私は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
以下で書かれているオートロードの仕組みのについて導入方法が知りたいです。
公式ドキュメントを見ても理解できませんでした。
> では逆に、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',
));
よろしくお願いいたします。
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
app/classesの下に、クラス名の命名ルールに従って、配置するだけです。オートロードは実装されています。
http://press.nekoget.com/fuelphp_doc/general/extending_core.html#extend_and_replace
Autoloader::add_classes(array(..に関しては、コアクラスの置き換えの話しでないでしょうか?
ここまで、書いている途中でkenjiさんが投稿したようですので、後ひとつだけ。
それともhogeディレクトリーをオートロードの検索パスに加えたいということでしょうか?
> require_once 'hoge/functions.php';
>
> ↓ 下記に代替できないか?
>
> /app/bootstrap.php
> Autoloader::add_classes(array(
> 'hoge' => APPPATH.'classes/functions.php',
> ));
> これはできそうですが、動きませんでしたか?
On Fri, 16 Mar 2012 21:25:11 +0900
HiroKws <hir...@gmail.com> wrote:
> Autoloader::add_classes(array(..に関しては、コアクラスの置き換えの話しでないでしょうか?
これは、クラスとそのファイルのパスをあらかじめ登録することで
ファイル検索の時間をなくし、ロードを高速化するための仕組みだと
思います。
コアクラスの置き換えにも使われますが。
core の bootstrap の add_classes() にずらーっとクラスが
並んでるのは、パフォーマンスのためです。
// Kenji
コアクラスの置き換えにも使われますが。
core の bootstrap の add_classes() にずらーっとクラスが
並んでるのは、パフォーマンスのためです。
最速の方法は、オートロードを利用せず、自分でinclude/requireを書くことです。余計なオーバーヘッドがかかりません。
クラスを予め読み込みたいのであれば、http://press.nekoget.com/fuelphp_doc/general/configuration.htmlを参考に、always_load.classesを設定したらいかがでしょう。app/config/config.phpで設定します。
多分、コアでなく、自前で作成したクラスも、読み込んでくれたと思います。
事前にクラスを読み込むことは、FuelPHPでは「普通」あまり行われないかと思います。私はやったことがありません。ですから、すいませんが明確にどうやるかお答えできません。(今のところ、調査するためにテストコードを書くつもりはありません。)
なぜ、私が事前にクラスを読み込まないかといえば、クラスの読み込みの手間をFuelPHPが用意してくれているオートローダーに任せたいからです。FuelPHPを使用する理由の一つだからです。特徴ですね。
そのかわり、オートロードを利用するためには、クラスとファイル名のネーミングルールに従います。
迷わないかという問いについては、迷いますよ。新しいフレームワークです。ドキュメントも完璧ではありませんしね。だから、自分でコードを書いてFuelPHPの特徴とか、癖といったものを体得していくのです。(半年前にFuelPHPを知り、いろいろいじっていると書かれているので、こうした特徴なりは、既に体得できているのだと、思いますが。)
正直、私はkazuki endoさんが、どの程度のスキルをお持ちなのか図りかねています。他のフレームワークを使用した経験があるかないか、PHPの名前空間やクラスの知識はお持ちなのか、どうしてたった一つのコードの読み込み速度を早めることに頑張っているのかという理由がわからないので、何をどの程度まで詳しく書けばいいのか分かりかねています。無駄なコードを読み込まないという点で、オートロードは全体として、実行速度の向上に役だっていますからね。FulePHPが高速なフレームワークである理由の一つです。
何を書けば、kazuki endoさんに理解してもらえるのかわからないので、答えがあっている、間違っているを含め、他の人にタスキをわたします。ギブアップです。