PHP関数で呼んだまま返ってこないと言うのはアリ?

このQ&Aのポイント
  • 共同開発先から渡された関数「datasaveA()」が呼ばれるとプログラムが終了してしまう状況について、PHPではこのような関数が存在することがあります。
  • datasave.phpの中にはDataSaveA()という関数とDataSaveB()という関数があり、データをサーバー内の別々の場所に格納する仕様ですが、DataSaveA()は呼ばれると終了してしまうため、DataSaveB()を呼ぶことができません。
  • 作成者の方によると、DataSaveA()はhtmlをエコーバックして正常終了する仕様で、datasave.php自体も終了するとのことです。PHPでは、このような仕様の関数が存在することがあります。
回答を見る
  • ベストアンサー

PHP関数で呼んだまま返ってこないと言うのはアリ?

例えば次のようなPHPファイルがあります。 ttp://www.dataserver.jp/datasave.php?data=123 ”datasave.php”の中身 DataSaveA(); //保存1 DataSaveB(); //保存2 ”datasave.php”の中には”DataSaveA()”と”DataSaveB()”と言う関数があり、送られて来たデータをサーバー内の別々の場所に格納する仕様です。 所が、共同開発先から渡された関数”datasaveA()”は呼ぶと戻って来ないため、”DataSaveB()”を呼ぶことが出来ません。作成者の方は「”datasaveA()”はhtmlをエコーバックして正常終了する仕様で”datasave.php”自体も終了する」と言います。 呼んだら返って来ないでそのままプログラムが終了してしまう関数は経験がありませんがPHPではアリなのでしょうか。

  • PHP
  • 回答数7
  • ありがとう数5

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.6

>修正依頼をしているのですが、PHPでは今回のような仕様が一般的のように認識しているらしく、逆に自分で修正するよう依頼されています。 PHPで一般的な仕様かどうでもよくて DataSaveA()の仕様はどうなのかが問題だと思いますが。 まずはそこをはっきりさせるべきじゃないでしょうか。 ただ「PHPでは今回のような仕様が一般的」というのは言葉遊びだと思いますけどね。 呼び出し元に戻らない関数は一般的にありえますが、 呼び出し元に戻る関数と戻らない関数どちらが多いかといえば戻る方でしょうし。

flowergoo
質問者

お礼

ご回答頂きありがとうございます。 ご指摘の通り、関数自体の仕様もあるかと思いますので調べてみます。 本来戻るべき関数なのに使い方によって戻って来ない可能性も出てきました。 助かりました。

その他の回答 (6)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

別にCに似てるからと言って、作り方も一緒というわけでもないし。 そもそも、Cだって、ほとんどの関数は戻ってきます(main関数だってreturnで戻ります) プログラム終了させるのはそれが求められるときです。 PHPだからとかCだからとかは関係なくて、終了させたかったら終了する、戻りたかったら戻るというものです。 今回の件は仕様の不備です。 とりあえずは、プログラムを確認して、どんなタイミングでexitしているかを調べ、returnで置き換えられれないか考えてみましょう。

flowergoo
質問者

お礼

ご回答頂きありがとうございます。 DataSaveA()の内部を調べた所、exitは入っていませんでした。 ネット上のソースを引用したものらしく、動作保証もないようです。 使用者側の責任範ちゅうでデバッグを行わなければならないようです。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.5

> PHPもC言語なので基本概念には準拠していないとおかしいですよね。 ??? え? PHPってC言語だったんですか? 本気で知らなかったです。 んで、本題。 多分、include とか require とかして呼んでいるんだと 想像。 #2の人が回答しているように、exit()してしまえば、include した元のスクリプトごと終了します。 その include 以降は処理されません。 んで、回避方法。多分、かなり乱暴な方法です。 DataSaveA(); を 呼ぶスクリプトは datasave.php とは別のスクリプト(仮に datasave_sub.php)して、 datasave.php から datasave_sub.php を file() とか file_get_contents() で呼ぶ。 データの受け渡しは なんやかんや うまくやってください。

flowergoo
質問者

お礼

ご回答頂きありがとうございます。 正確に言うとPHPはC言語を参考に作られているのでコーディングもほぼC言語のようです。 仰るとおり、DataSaveA()はincludeして呼んでいるのでその先でexit()されているか無限ループになっている可能性があります。 回避策として、別スクリプトも検討してみます。

回答No.4

関数って y=f(x) y=f(void) void=f(x) void=f(void) ってパターンが普通にあるしどこが問題? >PHPではアリなのでしょうか。 別に上記に書いたように別にPHPだけではないけど 質問者ってプログラミングの基礎をすっ飛ばしてやっている人?

flowergoo
質問者

補足

ご回答頂きありがとうございます。 PHPもC言語なので基本概念には準拠していないとおかしいですよね。 修正依頼をしているのですが、PHPでは今回のような仕様が一般的のように認識しているらしく、逆に自分で修正するよう依頼されています。 これはプログラムの基礎に関する質問ですね。 良い参考になりました。

回答No.3

戻ってこない、戻り値がないサブプログラムを関数と呼ぶのが言葉として適切かどうかは別として。 終了のためや永久ループなど戻ってこない関数はPHPに限らず幾らでも有ります。 もちろん何らかの不具合で戻ってくるはずのものが戻らないこともありますが今回の場合は関数の開発者との意思疎通が出来ていないか、関数仕様を明確にしていない、理解していないのが原因でしょう。

flowergoo
質問者

補足

ご回答頂きありがとうございます。 意志の疎通が図れていなかった事は確かです。 このため、戻るように依頼をしているのですが「戻るようにしたいのなら自分でデバッグして下さい」と修正する予定が無いようです。問題を解決するためには相手が作成したプログラムをデバッグするしかないのですが、納得できません。

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

PHPというより、たいがいの言語では呼んだら戻ってこない関数を作ることは可能でしょう。 下記の関数は呼ばれると「stop!」と表示してプログラム全体が終了します。 function stop_app() { exit('stop!'); } とはいえ、通常の関数内で勝手に正常終了するのはバッドプラクティスと言ってよいでしょう。 PHPの言語仕様としてはアリですが、コーディング標準的にはナシだと思いますよ。

参考URL:
http://jp.php.net/manual/ja/function.exit.php
flowergoo
質問者

お礼

ご回答頂きありがとうございます。 exit()のように終了させる事が前提であれば理解できるのですが、今回のケースはやはりおかしいですね。 相手の技量の判断材料になりました。

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

phpでなくても、呼んだら帰ってこない関数はありだと思いますが。 ただあっても異常処理系で処理的にもう続けることができないなどのときに 呼ぶ関数などくらいだと思います。 他にあるとしたら、その関数で終了してしまって問題ないようなときとか。 コマンドラインで扱うプログラムでは、ヘルプ表示してそのまま終了する関数とかわりとあります。 ただ今回の件ではDataSaveA()の呼び出し元はそのまま処理を続ける仕様ということであれば DataSaveA()の仕様とかみ合わないわけですから、そこは先方と調整するしかないと思います。

flowergoo
質問者

お礼

ご回答頂きありがとうございます。 コマンドラインのプログラムでは確かにありますね。 調整を試みましたが相手は修正する気が無いようで自分でデバッグするよう依頼されています。

関連するQ&A

  • phpからjavascriptの関数呼び出し

    いつも大変お世話になっております。 今回は、phpからjavascriptの関数を呼び出す方法について質問があります。 現在、javascriptから数十個~数百個のURLをphp側にpostして、そのurlのデータを読み込んでいます。 そして、この数十個~数百個のurlを処理している間の途中経過が知りたいのです。 一つ処理するたびにjavascript側のコールバック関数などを呼び出したいのですが、何か良い方法はありましたらご教授下さい。

    • ベストアンサー
    • PHP
  • phpの互換性について

    phpの4.3.10と4.4.0ではどの程度の互換性があるのでしょうか? 現状、php4.4.0にて開発を行っていましたが、本番サーバのphpが4.3.10なのです 特に難しいこともしていないと思うので、動きそうな気はするのですが この関数の仕様が変わった。とか、こういう処理をすると動かないなどありますでしょうか? WebからDBに登録、変更などを行うありふれたツールです 画面表示にSmarty2.6.18を使用しています

    • ベストアンサー
    • PHP
  • ユーザー関数でのリソースを引数で処理

    お世話になります。 今PHPの勉強をしております。 PHPでGDを使用した画像処理で同じような処理をさせる部分があるので 関数を作成して処理させたいと思っているのですが、引数でリソースを 渡して処理することは出来るのでしょうか。 試行錯誤しながら色々やってみましたがうまくいきませんでした。 $image_data = @imagecreatetruecolor($x, $y); back_color_set($image_data); function back_color_set($data) { /* この部分の処理は正常動作したソースをコピーしてきて編集 */ $back_color = imagecolorallocate($data,255,255,255); imagefilledrectangle(data, 0, 0, $view_x, $view_y, $back_color); } 所々省略しておりますが正常動作したソースを関数化しただけです。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPのストアドプロシージャ仕様

    初めまして、桜井ともうします。 PHP、Sybaseを用いた開発を行っております。 PHPからSybaseへのデータ取得には sybase_query()関数にストアドプロシージャを 用いて行いたいと思っています。 しかし、PHPの仕様ではストアドプロシージャを 用いた際、最初の1行しか取得できないようです。 今回、どうしてもストアドプロシージャにこだわら 無ければならない理由があるので、 sybase_query()関数を書き換えて(作り替えて) 複数行取得できるようにしようと試みました。 ですが、ct_fetch()が行われている部分で うまくfetchされていないようなのです。 PHP、Sybaseともに初めて扱うものなので、 行き詰まってしまっています。 どなたか、良いアイディアがありましたら、 教えていただけないでしょうか。

    • ベストアンサー
    • PHP
  • phpの関数について質問です!

    エクセルのVLOOKUP関数みたいな関数をphpで作れますか? 一定の規則で保存されているテキストデータから値を取り出したいのですが・・・ 例えば、 xxx,2003年度,第3回,大問4,7<br /> zzz,2005年度,第1回,大問2,3<br /> rrr,2004年度,第2回,大問1,12<br /> sss,2006年度,第3回,大問3,2<br /> ddd,2006年度,第3回,大問2,4<br /> yyy,2000年度,第2回,大問2,3<br /> 上記のように保存されているテキストデータから、 xxxを目印に「2003年度,第3回,大問4,7」 という値を取り出せますか?

    • ベストアンサー
    • PHP
  • PHPのfrrite関数

    お世話になります。 PHPのfwrite関数について質問です。 下記の様な記述で、アクセスがあった際に$lineをdata.txtに保存する場合、同じタイミングで複数のアクセスがあった場合などにエラーは起きないのでしょうか? エラーが起こりうるのであれば、その対処方法を教えて頂きたいです。 $fp = fopen("data.txt", "w"); fwrite($fp, $line); fclose($fp);

    • 締切済み
    • PHP
  • PHPで取得したデータの扱い

    653と申します。宜しくお願いいたします。 現在、PHPとJavaScript, HTMLを用いてDBを検索するアプリケーションを 作成中です。 ------------------------------------------------------- <?php <省略> $val1 = [あるselect文で検索されたユニークのデータ]; $val2 = [あるselect文で検索されたユニークのデータ(※上記select文と異なる)]; echo($valu1); echo($valu2);  <省略> ?> <script language="javascript"> <!-- Begin alert(<?=$value1?>); alert(<?=$value2?>); <省略> // End --> </script> <以下省略> ------------------------------------------ 上記のようなソースを書きました。 PHP内のecho関数で画面に表示させると $value1 ⇒ '950'、$value2⇒ '410'と出るとします。 この値は実際にDBに格納されているデータと同じ為、正常値と みなします。 しかしJavaScriptないのAlertで表示させると $value1 ⇒ '950'、$value2⇒ '299'と出てしまいます。 この(特に$value2)データの内容が変わってしまうのは なぜでしょうか? $value1, $value2の順番を替えても同じ結果になります。 PHPで取得したデータを格納した変数をJavaScript内で 使用するには何か特別な使用方法などがあるのでしょうか? もしくは上記の使い方が間違っているのでしょうか? ずっと悩んでます・・・(泣)

  • PHP staticな変数

    phpでstaticな変数について教えてください。 ユーザの情報をstaticな変数に格納した際に、誰からでも参照できてしまうのでしょうか? 例えば今ログイン情報を格納するstatic変数があり、ログイン情報を取得してそのstatic変数に値を格納するstaticなメソッドがあるとします。このメソッドは、その変数にまだ値がない場合に、ログイン情報取得してそのあとその変数へ格納し、その変数にすでに値があった場合に、その変数の中身を返す仕様だとします。最初のユーザAがアクセスしてきてその変数にAの情報を格納します。ほぼどうじにユーザBがアクセスしてきた場合は、そのメソッドを呼んだ際に直前に格納されたAの情報が取れてしまうのでしょうか?それともそのstaticな変数にはまだ何もないのでしょうか?よく分かりません。私は間違って理解してしまってるのでしょうか?宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP System関数が動作しません

    サーバー上の、あるphpファイル(sample_c.php)をシステム関数を使用して実行する必要があり、以下の流れのプログラムを作成しました。 sample_a.php でSubmit sample_b.php でSystem関数でsample_c.phpを呼び出し sample_c.php で実行 です。 <? /* sample_a.php */ ?> <form action="sample_b.php" method="post"> <input type="hidden" name="login" value="sample_user"> <input type="hidden" name="action" value="trigger_b"> <input type="submit" value="submit"> </form> <? /* sample_a.php */ ?> <? if($_POST['action'] =="trigger_b") { $login = $_POST['login']; system("sample_c.php $login"); header('Location: sample_a.php?action=fin'); exit; } else { header('Location: sample_a.php?action=error'); exit; } ?> <? /* sample_c.php */ ?> $_SERVER['argv'] で受け取った値を処理 ----------------- 3つのファイルは全て同じ階層に配置してあります。 sample_a.phpでsubmitすると、sample_a.php?action=fin にリダイレクトするのですが、 sample_c.php内の動作が実行されていません。 中身はDB接続して、テーブルに保存する単純なsql文が入っていて、sample_c.php単体での動作は確認しています。 (単体テストの場合は$_SERVER['argv']の代わりに変数に値をセットして実行しています。) System関数で変数を受け渡さずに system("sample_c.php $login"); を system("sample_c.php") として実行してもうまくいきません。; 原因が分かるかたがいらっしゃれば教えてください。 お願いします。

    • ベストアンサー
    • PHP
  • 現在、Windows7で、Apache2.0.63とPHP5.2.13

    現在、Windows7で、Apache2.0.63とPHP5.2.13をインストールし、 環境設定まで終了したので、PHPINFOを流そうとApacheのhtdocsフォルダに データを格納しようとしたら、エラーメッセージ 「この場所に保存するアクセス権限がありません」が出てしまいました。 ちなみに、このPCを使用しているのは私一人で、ユーザIDも1つしかありません。 ちなみに、htdocsフォルダの読み取り専用にチェックが入っていたので それをはずそうとしましたが、そこでも同じエラーメッセージが。 どのようにすればいいでしょうか。

    • ベストアンサー
    • PHP