phpのパス指定に関する問題

このQ&Aのポイント
  • 初めてphpを触っています。いくつかの処理を外部ファイルにしたいのですが、パスの指定が悪いのか、同じ階層に置いたり、いろいろ試してもfatal error ばかりです。どこが悪いのか、教えていただけないでしょうか?
  • サンプルとして、moto.phpのなかのincludeフォルダー内の外部ファイル:func.phpを実行することとします。外部ファイルは見えているようなのに、どうして関数がundefined になってしまうのでしょうか?phpの基本的なことなのかもしれませんが、よろしくアドバイスお願いできればと思います。
  • コマンドラインからphp moto.phpを実行すると、Fatal error: Call to undefined function return_word()となってしまいます。
回答を見る
  • ベストアンサー

phpのパス指定

初めてphpを触っています。 いくつかの処理を外部ファイルにしたいのですが パスの指定が悪いのか、同じ階層に置いたり、いろいろ試してもfatal error ばかりです。 どこが悪いのか、教えていただけないでしょうか? サンプルとして、moto.phpのなかのincludeフォルダー内の外部ファイル:func.phpを実行することとします。 moto.php <?php require "./include/func.php"); $a = 2; $b = 1; $c = $a - $b * $a; echo return_word($a); echo "<br>"; //改行 echo return_word($b); echo "<br>"; //改行 echo return_word($c); ?> func.php <? php function return_word ( $data ){ if ( $a==1){ return "a"; }else if ($a==2){ return "b"; }else{ return "c"; } } ?> コマンドラインから php moto.php を実行すると <? php function return_word ( $data ){ if ( $a==1){ return "a"; }else if ($a==2){ return "b"; }else{ return "c"; } } ?> Fatal error: Call to undefined function return_word() in C:\xxxxxx\php\moto.php on line 9 となってしまいます。 外部ファイルは見えているようなのに、どうして関数がundefined になってしまうのでしょうか? phpの基本的なことなのかもしれませんが よろしくアドバイスお願いできればと思います。

  • jg1wjz
  • お礼率91% (148/162)
  • PHP
  • 回答数4
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5082/13279)
回答No.4

> ファイルの中身は読み込んでいるので、 > 質問は、何故読み込んだファイル内の関数が実行できないか???でした! > もしかしてphpでは こういう方法で外部関数を実行するのではなかったり??? require 関数は外部ファイルを読み込んでプログラムの一部として実行するモノですから、認識は正しいです。 require を実行してもファイルの中身が表示されることはありませんので、moto.php に書かれているプログラムが require では無く、別の関数に書き換わっていたりしませんか?

jg1wjz
質問者

お礼

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など、無し)をコマンドでたたいてみたら、 ちゃんと実行していました。 何をどうやって調べたらよいのか。。。 すみません、引き続き よろしくお願いいたします。

jg1wjz
質問者

補足

t_ohtaさん、有難うございます&大変お世話になりました。 こんなところに書くのも・・と思いましたが、ここしか新たに書き込める場所が無かったので、ここで失礼します。 いろいろ調べた結果、自己解決いたしました。 func.phpをコマンドで動かしてもソースコードになっていたのです。 つまりはfunc.phpはphpではない、、ということに気付き、 じーーーっと、確認したところ <?php ではなく <? php と、?pの間にスペースが入っていたのが 原因でした。 ホントにケアレスミスでした。 でも、原因がわかって、、、 なおかつ、別ファイルを呼べて実行できて、ホントに良かったです。 これも、いろいろ調べていただいたおかげで、たどり着けた結果です。 ありがとうございました。 ホントに困っていたので、回答をいただて心強かったです。 BAにさせていただきます。

その他の回答 (3)

  • t_ohta
  • ベストアンサー率38% (5082/13279)
回答No.3

> moto.phpに定義されている $a がそのまま func.php でも使えると理解していますが、間違っていますか? 間違っています。 関数内はスコープが違うので、関数の外で定義された変数は参照できません。 その為に引数を使って関数にデータを渡すわけですから、return_word() の中は引数の $data を使わなければいけません。 require 自体がエラーになっていないのであれば、パスは正しく func.php の読み込みに成功してると言う事になります。 気になる点は、実行結果を質問に書かれていますが、そこに func.php の内容がそのまま表示されていますが、実際に実行結果として func.php の中身がコマンドプロンプトに表示されるのですか? もし func.php の中身が表示されるのだとすると、require として処理されていないので、moto.php の中身が質問に書かれている内容と異なると思われます。

jg1wjz
質問者

お礼

t_ohtaさん、ありがとうございます。 引数の件、おっしゃるとおりです。 すみません、頭が回らなくて、、、。 func.php内では$dataを参照ですね。 ###実際に実行結果として func.php の中身がコマンドプロンプトに表示されるのですか? そうです。 ここに載せるために php moto.php を実行する際、 リダイレクトで結果をファイルに書き込んで、その内容を転記しました。 ###もし func.php の中身が表示されるのだとすると、require として処理されていないので、moto.php の中身が質問に書かれている内容と異なると思われます。 そういえば、そうですね! 今、気付きました。 phpは初めてで、そういうことにも気付かなくて失礼しました。 ファイルの中身は読み込んでいるので、 質問は、何故読み込んだファイル内の関数が実行できないか???でした! もしかしてphpでは こういう方法で外部関数を実行するのではなかったり??? 別に質問したほうがいいでしょうか。

  • t_ohta
  • ベストアンサー率38% (5082/13279)
回答No.2

> ネットで調べると何故か includeは必ず()カッコつきなんですね。 > requireは ()が無かったり。 include も require もカッコ有り無し、どちらでもいけますよ。 まずはPHPの公式マニュアル http://www.php.net/manual/ja/ を読むようにしましょう。 プログラムの方ですが、記載している内容以外に書かれている内容があったり、転記漏れがあったりしませんか? 手元で確認したところ return_word() の中で $a が定義されて無いと怒られる以外にエラーは出ませんでした。

jg1wjz
質問者

お礼

t_ohtaさん、ありがとうございます。 サンプルphpはネット上のコードをそのまま貼り付けました。 moto.phpに定義されている $a がそのまま func.php でも使えると理解していますが、間違っていますか? そうですか、、、Fatal errorにはならなかったのですね。。。 それと、昨日(家の環境:windows)もちょっと悩んだのですが php.iniのdirectoryなどの設定、関係ありますか? 昨日、結局directory設定がdefaultだったので、そこは直したのですが結果は変わりませんでした コマンドラインからの操作で、ファイルの内容は見えてる、 でも関数名がundefined、、、なんででしょうか、関数名はコピペしたのに。。。 家の環境(windowa)でも、Fatal error 会社の環境(CentOS)でもFatal Error どんな方法でもいいのですが、外部ファイルを読み込んで実行させたいのです。 引き続きまして、よろしくお願いいたします!

jg1wjz
質問者

補足

t_ohtaさん、すみません。 「お礼コメント」のところに書いたdirectoryとは、 include_path のことです。今、マニュアルを読んでいまして気付きました。 ちゃんと書かなくてすみませんでした。

  • t_ohta
  • ベストアンサー率38% (5082/13279)
回答No.1

まず、「<?php」の「<」が全角になっていますが、これは転記ミスでしょうか? 元々のプログラムも全角で書かれているなら半角にする必要があります。 次に、「require "./include/func.php");」ですが「require」と「 " 」の間に「 ( 」がありません。 転記ミスで無いとするとプログラムの修正が必要です。

jg1wjz
質問者

お礼

t_ohtaさん、有難うございます。 < など全角は、わざと全角にして記載しました。実際は半角です。 すみません、説明忘れてしまいました。 それと、( は転記ミスです。 include とか、いろいろ試してみていたので、ずれてしまいました。 ネットで調べると何故か includeは必ず()カッコつきなんですね。 requireは ()が無かったり。 その辺りも影響するのかと思って、いろいろ試してました。 引き続きよろしくお願いいたします。 

関連するQ&A

  • PHP returnについて

    いつもお世話になっております。 PHPのreturn についてお伺いさせてください。 以下のように外部ファンクションを設けておりまして、本体から渡される値を、ファンクション側で計算させて、値を返す方法なのですが、どうもうまくいきません。 どこら辺が間違っているのでしょう? test_1.php ------------------------------------ require_once('test_2.php'); $a=0; $b=5; $c=5; $a = get_data(b,c); test_2.php ------------------------------------ function get_data($data1,$data2){ $data = $data1+$data2; return $data; } ------------------------------------ こんな感じで、本来であればtest_1.phpの$aにtest_2.phpの$dataの結果を渡したいのですが、どうもうまくいかないのです。 申し訳ありませんが、教えて頂けませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • html内にphpを混ぜる時

    <?php if(a > b){ echo "<p>hello!</p>"; }else{ echo "<p>see you!</p>"; } ?> こういう事ってよくあると思いますが、一々echoなどを使ってhtmlを吐き出させるのはあまりスマートに感じません。 他にやり方はあるのでしょうか?

    • ベストアンサー
    • PHP
  • include_pathについて。

    PHP 5.2以上のバージョンの話として質問をさせて頂きます。 (ローカルではWindows版XAMPPを使用。リモートはLinuxサーバー。) ----- <ファイルの位置関係> imgディレクトリ --- C.jpg (画像ファイル) mainディレクトリ --- A.php sub ディレクトリ --- funcディレクトリ --- B.php (img、main、subディレクトリは3つとも同階層) //------- (A.phpの記述) require_once '../sub/func/B.php'; //------- (B.phpの記述) echo '<img src="C.jpgのパス">'; // ←■画像Cを表示したい■ //★どう表示されるかテスト★ echo dirname(__FILE__) ;   //----- このような状況で、 A.phpにアクセスすると、★テスト★の所は、 ~/sub/func   //←のように表示される。 // つまりこれは、__FILE__ は、 // A.phpではなく、B.phpを指している。(?) と、このような時、B.phpの中で、 C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpから見た、C画像の相対パスで書いたらいい? それとも、B.phpから見たソレでしょうか? phpinfo()でinclude_pathの項目を調べると、 .:/usr/local/lib/php/~ のように書かれています。(デフォルトのままです。)

    • ベストアンサー
    • PHP
  • このPHPコードのエラー原因を教えてください。

    いつもお世話になっています。 現在PHPの勉強をしているのですが、プログラムがエラーとなり、原因が分からず困っています。 原因の分かる方がいらっしゃれば、教えて頂きたいと思います。 状況は以下の様になっています。 ・PHPのversionは5.2.0、XAMPPはv3.2.1を使用しています。 ・Aptanaでは一番最後のcreate_radio($c, $d)関数で構文エラーが発生しているので、問題はこの辺りにあるのではと考えてはいます。 ・return <<< __end__ ~ __end__;の記述方法がPHPの設定上できないのかもしれません。 (echo <<< ~も使用できませんでした。) ・以下コードです <?php show_header(); show_form(); show_footer(); function show_header(){ $color = "white"; if(isset($_GET["Name_Of_Color"])){ $color = $_GET["Name_Of_Color"]; $color_html = htmlspecialchars($color); echo "<html><body bgcolor='color_html'>"; }else{ echo "<html><body bgcolor='white'>"; } } function show_footer(){ echo "</body></html>"; } function show_form(){ $colors = array("赤色" => "red", "青色" => "blue", "白色" => "white"); echo "<form>"; foreach($colors as $a => $b){ echo create_radio($a, $b); } echo "<input type='submit' value='変更'>"; echo "</form>"; } function create_radio($c, $d){ return <<< __end__ <input type="radio" id="$c" name="Name_Of_Color" value="$d"> <label for="$c">$c</label> __end__; } ?> それでは、よろしくお願いします。

    • 締切済み
    • PHP
  • 【PHP】関数で処理が止まってる??

    お世話になります。 PHPでの質問ですが、PHPに限ったものではないように思いますので、プログラム全般に対しての質問と思って下さって結構です。 ※PHP特有のという意見があれば、それも大歓迎です。 下記のようなコードを組んでみました。 <?php echo "func1の結果["; echo func1(); echo "]"; function func1(){ (内容は割愛) return TRUE; } ?> このコードをアップしてアクセスしてみると   出力結果  func1の結果[ でした。 ブラウザのステータスに「ページが表示されました」とあるので、処理中で出力待ちということはないと思います。 > echo func1(); > echo "]"; の箇所の出力はどうなっていると考えればいいのでしょうか? 「関数の内容次第で・・・」とお答えになる方、どういう内容だとこのような結果になるのかというところでお答えください。 私のプログラムによる根本的な考え方は、プログラムは上から下に順番になので、 上記内容の箇所にどんなコードがあったとしても、func1関数はTRUEを返すので、結果としては「func1の結果[1]」となるはずでした。 でも実際の出力結果をみると処理が途中で(おそらくfunc1()内で)止まっているともいます。 timeoutではないため無限ループに嵌ってっていうのもないと思います。 これはどういうことでしょう???

    • 締切済み
    • PHP
  • phpのコードでこの2つは何が違うんでしょうか?

    phpのコードでこの2つは何が違うんでしょうか? 問題文が画像に書いてあるもので、上のコードは私が考えたもので、下のコードは画像の問題の答えです 私の解いた答え <?php $age = 10; if(10 <= $age < 20){ echo("10代"); }else if(20 <= $age < 30){ echo("20代"); }else if(30 <= $age < 40){ echo("30代"); }else{ echo("それ以外"); } 画像の問題文の正解 <?php $age = 43; if($age >= 10 && $age < 20){ echo("10代"); }else if($age >= 20 && $age < 30){ echo("20代"); }else if($age >= 30 && $age < 40){ echo("30代"); }else{ echo("それ以外"); }

    • ベストアンサー
    • PHP
  • phpのECHOが出力されない:wordpress

    A B C "text" というJSONデータのCを画面に出したい時、 echo $obj['A']['B']['C']; もしくは echo $obj->A->B->C; という文をphpの中に書き込んだのですが、 echo ”Halloworld”とかは出るのに、変数になると出ません。 ちなみにfunction.phpでショートコードから呼び出すファイルに記述しています。 何が間違っているのでしょうか。

    • 締切済み
    • PHP
  • 引数に関して

    例えば、 C,B(C),A(B)という3つの関数があるとき、 それぞれをfunctionで書こうとすると、 Bの引数は-(C) Aの引数は-(B) でいいのでしょうか!? Aのルーチンには見た目上Cはでてこないので(CはBに包括されているため)、引数はBだけでいいのでしょうか?(☆部分) 説明不足で伝わっていないといけないので、サンプル載せときます。 ☆ function func_A(B) or (B,C) implicit none real*8 func_A,func_B,B,val * B=funcB(C) * val=(1.0d0-B)*3.0d0+B*7.0d0 func_A=val return end ------------------------------------- function func_B(C) implicit none real*8 func_B,func_C,C,val * C=func_C * val=C+5.0d0 func_B=val return end ---------------------------------- function func_C implicit none real*8 val * val=3.0d0 func_C=val return end ------------------------- Aの引数としてCも載せるのが正しい気がしますが、自信がありません。ご意見聞かせて下さい。

  • phpのthis

    a.phpを作成しました。 thisによるアクセスが可能かと思ったのですが、やはりできないのでしょうか。 ===a.php==== <?php $val = 1 ; method(); function method(){ echo $val; echo $this -> val; } ?> ===a.phpここまで===== 別のphpファイル(try.php)には以下内容を記述しました。 ===try.php=== <?php class User { private $id; public function get_id(){ return $this->id;} } public function set_id($id){ $this->id=$id; } ?> 質問: なぜ、 「try.phpでは、$idにthisでアクセスできるのでしょうか? (returnの違いかと思いましたが、set関数はreturnがないのでretrunでもないと思っています。) a.phpでは、thisで valにアクセスできないのでしょうか?」 try.phpは、classを付けてクラス作成しているから、$idにthisでアクセスできるのでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPの勉強してちょっとした質問

    初歩的な質問なんです。 PHPで別ページを作ってみたいと思ったのですが、 どうしたらいいかと質問をしてみました。 <?php switch($_POST["mode"]){ case "test_b": break; default: test_a(); } function test_a(){ echo "test_a"; echo "<a href="index.php?mode=test">test_b</a>"; } function test_b(){ echo "test_b"; echo "<a href="index.php?mode=test">test_a</a>" } ?>

    • 締切済み
    • PHP

専門家に質問してみよう