- ベストアンサー
phpのパス指定に関する問題
- 初めてphpを触っています。いくつかの処理を外部ファイルにしたいのですが、パスの指定が悪いのか、同じ階層に置いたり、いろいろ試してもfatal error ばかりです。どこが悪いのか、教えていただけないでしょうか?
- サンプルとして、moto.phpのなかのincludeフォルダー内の外部ファイル:func.phpを実行することとします。外部ファイルは見えているようなのに、どうして関数がundefined になってしまうのでしょうか?phpの基本的なことなのかもしれませんが、よろしくアドバイスお願いできればと思います。
- コマンドラインからphp moto.phpを実行すると、Fatal error: Call to undefined function return_word()となってしまいます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> ファイルの中身は読み込んでいるので、 > 質問は、何故読み込んだファイル内の関数が実行できないか???でした! > もしかしてphpでは こういう方法で外部関数を実行するのではなかったり??? require 関数は外部ファイルを読み込んでプログラムの一部として実行するモノですから、認識は正しいです。 require を実行してもファイルの中身が表示されることはありませんので、moto.php に書かれているプログラムが require では無く、別の関数に書き換わっていたりしませんか?
その他の回答 (3)
- t_ohta
- ベストアンサー率38% (5238/13705)
> moto.phpに定義されている $a がそのまま func.php でも使えると理解していますが、間違っていますか? 間違っています。 関数内はスコープが違うので、関数の外で定義された変数は参照できません。 その為に引数を使って関数にデータを渡すわけですから、return_word() の中は引数の $data を使わなければいけません。 require 自体がエラーになっていないのであれば、パスは正しく func.php の読み込みに成功してると言う事になります。 気になる点は、実行結果を質問に書かれていますが、そこに func.php の内容がそのまま表示されていますが、実際に実行結果として func.php の中身がコマンドプロンプトに表示されるのですか? もし func.php の中身が表示されるのだとすると、require として処理されていないので、moto.php の中身が質問に書かれている内容と異なると思われます。
お礼
t_ohtaさん、ありがとうございます。 引数の件、おっしゃるとおりです。 すみません、頭が回らなくて、、、。 func.php内では$dataを参照ですね。 ###実際に実行結果として func.php の中身がコマンドプロンプトに表示されるのですか? そうです。 ここに載せるために php moto.php を実行する際、 リダイレクトで結果をファイルに書き込んで、その内容を転記しました。 ###もし func.php の中身が表示されるのだとすると、require として処理されていないので、moto.php の中身が質問に書かれている内容と異なると思われます。 そういえば、そうですね! 今、気付きました。 phpは初めてで、そういうことにも気付かなくて失礼しました。 ファイルの中身は読み込んでいるので、 質問は、何故読み込んだファイル内の関数が実行できないか???でした! もしかしてphpでは こういう方法で外部関数を実行するのではなかったり??? 別に質問したほうがいいでしょうか。
- t_ohta
- ベストアンサー率38% (5238/13705)
> ネットで調べると何故か includeは必ず()カッコつきなんですね。 > requireは ()が無かったり。 include も require もカッコ有り無し、どちらでもいけますよ。 まずはPHPの公式マニュアル http://www.php.net/manual/ja/ を読むようにしましょう。 プログラムの方ですが、記載している内容以外に書かれている内容があったり、転記漏れがあったりしませんか? 手元で確認したところ return_word() の中で $a が定義されて無いと怒られる以外にエラーは出ませんでした。
お礼
t_ohtaさん、ありがとうございます。 サンプルphpはネット上のコードをそのまま貼り付けました。 moto.phpに定義されている $a がそのまま func.php でも使えると理解していますが、間違っていますか? そうですか、、、Fatal errorにはならなかったのですね。。。 それと、昨日(家の環境:windows)もちょっと悩んだのですが php.iniのdirectoryなどの設定、関係ありますか? 昨日、結局directory設定がdefaultだったので、そこは直したのですが結果は変わりませんでした コマンドラインからの操作で、ファイルの内容は見えてる、 でも関数名がundefined、、、なんででしょうか、関数名はコピペしたのに。。。 家の環境(windowa)でも、Fatal error 会社の環境(CentOS)でもFatal Error どんな方法でもいいのですが、外部ファイルを読み込んで実行させたいのです。 引き続きまして、よろしくお願いいたします!
補足
t_ohtaさん、すみません。 「お礼コメント」のところに書いたdirectoryとは、 include_path のことです。今、マニュアルを読んでいまして気付きました。 ちゃんと書かなくてすみませんでした。
- t_ohta
- ベストアンサー率38% (5238/13705)
まず、「<?php」の「<」が全角になっていますが、これは転記ミスでしょうか? 元々のプログラムも全角で書かれているなら半角にする必要があります。 次に、「require "./include/func.php");」ですが「require」と「 " 」の間に「 ( 」がありません。 転記ミスで無いとするとプログラムの修正が必要です。
お礼
t_ohtaさん、有難うございます。 < など全角は、わざと全角にして記載しました。実際は半角です。 すみません、説明忘れてしまいました。 それと、( は転記ミスです。 include とか、いろいろ試してみていたので、ずれてしまいました。 ネットで調べると何故か includeは必ず()カッコつきなんですね。 requireは ()が無かったり。 その辺りも影響するのかと思って、いろいろ試してました。 引き続きよろしくお願いいたします。
お礼
t_ohtaさん、ありがとうございます。 moto.php に書かれているプログラムは require で func.phpを呼んでいます。 今、httpd.conf の Addtype application/x-httpd-php .php しか追加していなかったので、 Addtype application/x-httpd-php-source .phps も追加しました。 (特に影響ないと思いますが) それと、moto.php に echo "moto"; と追加し、WebServer上にアップし、動かしたら moto だけ表示されました。 WebServerに接続して、motoとfunc.phpをアップし、コマンドから たたいてみても同じくソースコードが表示されました。 もともと動いていたphpフアイル(requireなど、無し)をコマンドでたたいてみたら、 ちゃんと実行していました。 何をどうやって調べたらよいのか。。。 すみません、引き続き よろしくお願いいたします。
補足
t_ohtaさん、有難うございます&大変お世話になりました。 こんなところに書くのも・・と思いましたが、ここしか新たに書き込める場所が無かったので、ここで失礼します。 いろいろ調べた結果、自己解決いたしました。 func.phpをコマンドで動かしてもソースコードになっていたのです。 つまりはfunc.phpはphpではない、、ということに気付き、 じーーーっと、確認したところ <?php ではなく <? php と、?pの間にスペースが入っていたのが 原因でした。 ホントにケアレスミスでした。 でも、原因がわかって、、、 なおかつ、別ファイルを呼べて実行できて、ホントに良かったです。 これも、いろいろ調べていただいたおかげで、たどり着けた結果です。 ありがとうございました。 ホントに困っていたので、回答をいただて心強かったです。 BAにさせていただきます。