- 締切済み
PHPでファイルを先に読み込ませる
PHP初心者です。 私が使用したい多くの関数を用意した「functions.php」を作成しました。 関数を使用するファイルは、これを文頭で読み込ませているのですが 出来れば初期状態(外部ファイルを読み込まない状態。requireなど使わないで)で使いたいと考えています。 「.htaccess」などで「functions.php」を読み込んで、「.htaccess」そのディレクトリ以下はPHPファイルを作成したら関数を使用できるようにしたいのです。 ※ちなみに私は使用したいサーバーの管理権限はありません 「.htaccess」では無くても良いのですが、こういう方法は可能ですか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- castor4bit
- ベストアンサー率0% (0/0)
PHPにはauto_prependと呼ばれる自動読み込み機能があり, php.iniまたは Apacheのhttpd.conf, .htaccessなどで設定が可能です。 .htaccessに記述する場合は、以下のように記述するとよいと思います。 ディレクトリ、読み込むPHPスクリプトのパスは、それぞれ環境に合わせて 変更してください。 <Directory /home/hogehoge/htdocs> php_value auto_prepend_file /path/to/functions.php </Directory>
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
> 私の中でイメージしていたのはどのURLを読み込んでも、.htaccessで1度 > 「functions.php」へ飛ばしてその後に指定のPHPを読み込ませるという処 > 理を行いたかったので.htaccess自体でPHPをincludeさせたいという事では > 無いです。 これなら可能です。まさにZendFrameworkのデフォルトルーティング手法ですから。 mod_rewriteを有効にし、.htaccessを RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ functions.php とかしてあげれば。 その後にfunctions.php内からHTTP情報を利用して他のファイルを呼ばせたり。 mod_rewriteが使える環境か確認すれば、この手法は可能です。 出来ないなら、各ファイルでget_included_files()とかを使って functions.phpが読み込まれているかを確認し、読み込まれていないなら functions.phpにリダイレクトさせてしまうとか。 多分ですが・・・。
お礼
回答遅くなってすみません。。 回答通りに処理したところ、無事にfunctions.phpを先読みすることができました! (RewriteEngineさえ知らなかったので勉強になりました。) ただ、この手法だと少しややこしい挙動になってしまうので castor4bitさんに教わった「auto_prepend」機能を.htaccessで使うことにします。 ありがとうございました。
- wp_
- ベストアンサー率54% (132/242)
少し関係ない横槍です。 .htaccessとphpコアの処理は階層が違うので「基本的には無理」です。 No.1の方のやり方以外では私は知りません。 あと、「よく使う関数郡」をひとつの場所に集めるのは危険です。 そこがボトルネックになりやすいです。(アクセス過多の心配がなければその限りではないですが) 機能ごと(クラスごと)にファイルを分けるのがシステム構築の常識であり、理想です。 当方は現場が変わりまくりなので再利用できるコードの重要性が身にしみております^^; 必要なとき必要なものを呼ぶような設計を心がけると良いと思いますよ。
お礼
>.htaccessとphpコアの処理は階層が違うので「基本的には無理」です。 私の中でイメージしていたのはどのURLを読み込んでも、.htaccessで1度「functions.php」へ飛ばしてその後に指定のPHPを読み込ませるという処理を行いたかったので.htaccess自体でPHPをincludeさせたいという事では無いです。 私は再利用できるコードの重要性はまだ感じた事がないほど経験が浅いので、素人なりに再利用できるオブジェクト的に考えて設計しようと思います。 アドバイスありがとうございました。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
Ethna、ZendFrameworkのようにHTTP情報によって処理が決定される ような仕組みにすれば可能です。 例えばEthnaの場合 http://ethna.jp/ethna-document-tutorial-overview.html このページの項4で言っている「index.php?action_login=true」というのは 必ずindex.phpとしてアクセスさせてsample_controller.phpをincludeさせ、 sample_controller.php内で共通的に利用するファイルなどを includeし(デフォルトの挙動の場合)、loginという実際に行いたい 処理を記しているファイルを実行させています。 その為、実際に行いたい処理にはincludeをする必要がなくなっています。 例えばZendFrameworkの場合 http://framework.zend.com/manual/ja/zend.controller.html#zend.controller.quickstart.go このページの最後で言っている「http://example.com/index/index」というのは mod_rewriteを利用して必ずindex.phpにアクセスするようにし、 index.phpにてindexというコントローラーと呼ばれるファイルを読み込み、 そこで共通的に利用するファイルなどをinclude出来(デフォルトの挙動の場合)、 indexというアクションコントローラーと呼ばれる実際に行いたい処理を 記してある箇所を実行させています。 その為、実際に行いたい処理にはincludeをする必要がなくなっています。 当然のことながら、結局はどこかでincludeはしないといけないんですけどね。 気持ちは凄く分かりますが、そういう仕組みを作るのが面倒なら、たった1ファイルだし コピペも苦じゃないし妥協してもいけると思います。 絶対パスにしておけばinclude_pathを気にする必要もないでしょうし、 環境が変わった場合はツールを使って、全ファイルに対して絶対パスの一括置換処理を 行えばいいだけですし。 絶対パスや置換が嫌なら、サーバ現行のinclude_pathにfunctions.phpが 含まれるディレクトリを合わせた状態のものを.htaccessで設定するとか。 .htaccessでは環境を整える事が出来るだけで、直接的にPHPコマンドを実行する事は不可能だと思います。詳しくないので分かりませんが。
お礼
返事おくれてスミマセン。。 参考サイトを読ませていただきました。 また、丁寧な解説ありがとうございます。勉強になりました。 質問投稿後も「.htaccess」の設定方法を検索してますが思っている挙動をさせる方法がわかりませんでした。 やはりこの場合は 対象ファイルに直接、絶対パスでのincludeが手っ取り早いようですね。 ただ、もっと何か簡単に解決する方法があるような気がするので(根拠はありません)、もう少し調べてみようと思っています。
お礼
ありがとうございます! まさしく、この「auto_prepend_file」が求めていた挙動です。 これで関数達を先読みすることができました。 すごく便利ですね。