function_exists関数の挙動について

このQ&Aのポイント
  • phpのfunction_exists関数は、指定された関数が定義されているかどうかを確認するものです。
  • 指定された関数が定義されている場合はtrueを返し、未定義の場合はfalseを返します。
  • スクリプトは上から下へ向かって実行されるため、if文が実行される前に関数が宣言されていない場合、falseを返すことになります。
回答を見る
  • ベストアンサー

function_exists関数の挙動について

以下のphpのコードを実行すると、 「hogehoge()関数が定義済みです。」とブラウザに表示されます。 ですが、スクリプトは上から下へ向かって実行されるわけで、 <if(function_exists('hogehoge'))>の箇所では、hogehoge関数はそんざいしないのでfalseに なると思うのです。 いったいどういう理屈なんでしょうか? よろしくお願い申し上げます。 (なお、下記ソースではタブを全角空白4文字に変換しています) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>関数が定義済みか調べる</title> </head> <body> <div> <?php if(function_exists('hogehoge')){     echo 'hogehoge()関数が定義済みです。'; }else{     echo 'hogehoge()関数は未定義です。'; } function hogehoge(){} ?> </div> </body> </html>

  • PHP
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
noname#244856
noname#244856
回答No.2

最初にコードが全て読み込まれます、ただし条件分岐の手前までです。例えば if (true) { function hogehoge(){} } とすると結果が変わりますw

その他の回答 (1)

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

PHPが純粋なインタプリタだったのはVer.4の初期までです。 現在は全てのコードが読み込まれた後に実行されるので、関数定義の場所は使用する前で後でも構いません。(実際には中間コードにコンパイルされた上で実行されている)

関連するQ&A

  • function()とはこれから関数をかきますとい

    function()とはこれから関数をかきますという宣言なのでしょうか? doctype宣言のようなイメージでしょうか? $('button’).click(function(){ $(’div.anime’).animation('width','100%'); }) その場合上記は無名関数に当たりますよね。 評価をしていないのになぜ実行されるのでしょうjか? また、function()はあちっこっちで出てきて、この場合は何なんだろうと混乱しませんか?

  • CekePHPでfile_exists関数を使う

    CakePHP Ver1.3.6で開発をしています。 アクションの中で、画像の存在判定にfile_exists関数を使ったのですが、 2バイトのファイル名のファイルの場合、存在するファイルがfalseになって しまいます。 対象のファイルが存在するときに、 if (file_exists('img/漢字.jpg')) echo 'あります'; else echo 'ありません'; if (file_exists('img/filename.jpg')) echo 'あります'; else echo 'ありません'; このとき、前者は’ありません’、後者は’あります’と表示されます。 app/webrootフォルダにtest.phpを作り、その中で同じ判定をすると、 両方とも’あります’と表示されます。 なぜアクションの中に記述したときのみ、2バイトファイル名を正しく 判定できないのでしょうか?

    • ベストアンサー
    • PHP
  • 関数の第二引数を省略可にする方法

    PHPのソースで <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $s .= ' - '. $strstr; return $s; } echo hogehoge('Hello world','ようこそ!'); // -------------- ?> とすると Hello world - ようこそ! とでますが、 hogehogeの第二引数を省略して <?php // -------------- echo hogehoge('Hello world'); // -------------- ?> hogehogeの第二引数を省略するとエラーが出るので <?php // -------------- function hogehoge($str,$strstr) { $s = $str; $result_strstr = $strstr; // if ( $result_strstr != '' ) ) { $s .= ' - '. $strstr; } if ( isset( $result_strstr ) ) { $s .= ' - '. $strstr; } return $s; } echo hogehoge('Hello world'); // -------------- ?> とやってもエラーが出て 第二引数を省略可という関数を作ることができません。 どのようにすればよいのでしょうか?

    • ベストアンサー
    • PHP
  • php 関数が定義されていない???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーメッセージは Fatal error: Uncaught Error: Call to undefined function getBlog() in C:\xampp\htdocs\detail.php:3 Stack trace: #0 {main} thrown in C:\xampp\htdocs\detail.php on line 3 です。 別のファイルで function getBlog($id) { if(empty($id)) { exit('idが不正です。'); と、getBlogという関数を使っています。 それを利用した、と言っています。 何故、3行目がエラーでしょうか? 度々申し訳ございません。 アドバイスの程、宜しくお願い申し上げます。      記 <?php require_once('dbc.php'); $result = getBlog($_GET['id']); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ブログ詳細</title> </head> <body> <h2>ブログ詳細</h2> <h3>タイトル:<?php echo $result['title'] ?> </h3> <p>投稿日時:<?php echo $result['post_at'] ?></p> <p>カテゴリー:<?php echo setCategoryName($result['category']) ?></p> <hr> <p>本文:<?php echo $result['content'] ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • javascriptからのphpクラス関数の呼び出し

    <?php /* * TESTPHP.INC */ class SelRecord { function ExeQuery($StrSQL) { @$result = pg_query(con, $sql); // selectを実行 if ($result == false) { printf("SQL($sql)の実行に失敗しました。理由: " . pg_last_error($this->con)); return false; } return $result; } ?> ----------------------------------------------------------------------------------- /* * root.php */ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <html lang="ja"> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <script language="JavaScript"> <!-- function GetData() { $StrSQL = "SELECT * from tbl" ここからクラスSelRecordのExeQueryを呼び出すには、どのような記述を すればよいのでしょうか。よろしくお願いします。 } --> </script> <title>Sample</title> </HEAD> <BODY> </BODY> </HTML>

  • actionscriptのfunction関数について

    現在Flashの勉強をしている者です。 超初心者丸出しの質問なのですが調べても納得いく回答にめぐりあわなかったのでここで質問させていただきます(前回もPHPについて質問したら素晴らしい回答があったので!!) Function関数なのですが function 半角英字で任意の文字 () {  以下実行文 } でユーザー定義関数が作られるのはわかったのですが、 本を読みながら勉強をしていてわからないのが this.onRollOver = function () { roll = true; this.nextFrame(); }; という記述で、『マウスがムービークリップ上にあるかの判定処理』という説明がされているのですが恥ずかしながらよくわかりません。 ユーザー定義関数のFunctionと上記のものでは別物なのでしょうか? ちょっと曖昧な質問で申し訳ないのですが どなたが是非よろしくお願いします。。。

    • ベストアンサー
    • Flash
  • file get contentsが使用禁止だった

    ### 前提・実現したいこと file_get_contensがサーバーのセキュリティ上禁止だったのでcurlという関数で 「取り出したいデータのファイル」にある <div class="menu">から</div>までをget通信でedit.phpにurlを渡し、内容を取り出したいのですが、mb_subster等を使いとりだしを試みましたが分からなかったので取り出しかたを教えてください。 よろしくお願いします。 ソースコード <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>取り出したいデータのファイル</title> </head> <style> </style> <body> <form method="get" action="../edit.php"> <button type="submit" name="edit" value="<?php echo (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];?>">編集</button> </form> <div class="menu"> <h1>メニュー</h1> <p>カレー</p> </div> </body> </html> edit.php <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title>別のファイルを表示したいファイル</title> </head> <style> </style> <body> <?php echo $_REQUEST['edit']; $url = $_REQUEST['edit']; $conn = curl_init(); // cURLセッションの初期化 curl_setopt($conn, CURLOPT_URL, $url); // 取得するURLを指定 curl_setopt($conn, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す。 $res = curl_exec($conn); echo ($res); curl_close($conn); //セッションの終了 ?> </body> </html>

    • ベストアンサー
    • PHP
  • phpで関数を定義するfunctionは、なんとい

    phpで関数を定義するfunctionは、なんという物なんですか?

    • ベストアンサー
    • PHP
  • phpコールバック関数について

    php初心者のものですが、コールバック関数(可変関数)についての質問です。 //引数の与えらえられた名前をもつ関数が存在すれば呼び出すための関数 function func_caller($name)(2) { if (function_exists($name)) { (3) $name(); //可変換数をして関数の呼び出し } } function foo() { echo 'foo call', PHP_EOL; } func_caller('foo'); //foo called(1) とあるのですが (1)の関数が(2)に呼ばれて$nameはfooが入ってて (3)が評価されまでわかるのですが次にどうなっていくのかわかりません。 どなたかわかる方いらっしゃいましたらどうか教えていただけないでしょうか? 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 引数を持つコールバック関数をonloadで複数実行

    下記のような内容で、指定したidを持つ要素に新しい内容を追加したいのですが、この内容だとcontent2のidを持つdiv要素にしか内容が追加されません。 そこで、対象となるidを持つ要素をいくつ追加しても反映されるようにしたいのですが、これを実現するにはどうしたら良いでしょうか? アドバイス等、何かしらお力添えを頂ければ幸いです。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Title</title> <script type="text/javascript"> // </body>直前には置きたくない // 指定したidを持つ要素に新たな内容を追加する関数 function ins( id ) { var output = document.createElement( 'span' ); output.innerHTML = '<p>content</p>'; // 追加する内容はhtmlやjavascriptなど必要に応じて変化する var element = document.getElementById( id ); element.appendChild( output ); } window.onload = function() { ins( 'content1' ); } window.onload = function() { ins( 'content2' ); } </script> </head> <body> <div id="content1"></div> <!-- window.onloadではins( 'content2' );に上書きされてしまう --> <div id="content2"></div> <!-- <div id="content3"></div> <div id="content4"></div> ... いくつ追加しても対応出来るようにしたい --> </body> </html>

専門家に質問してみよう