• ベストアンサー

PHPの関数定義ついて。

PHPの関数定義ついて。 初歩的な質問かもしれませんが、 define関数での定数定義が、スクリプト実行時に評価されるのはなぜでしょうか。 なぜコンパイル時ではなくスクリプト実行時に評価しなければならないのでしょうか。 また、const文によるクラス定義が、コンパイル時に評価されるのはなぜでしょうか。 なぜクラス定義はコンパイルに評価しても問題ないのでしょうか。

noname#172780
noname#172780
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.1

define("FOO",$bar+$baz); などと書けますが、コンパイル時には$bar+$bazの値が定まらないので無理です。 一方、const hoge = だと定数表現しか書けないので、コンパイル時に値が定まります。

noname#172780
質問者

お礼

そもそも書式の違いで、スクリプト時に実行されるかコンパイル時に時に実行されるか違ってくるわけですね。 しかし、define関数はコンパイル時ではなくスクリプト実行時に評価しなければならないのはなぜでしょう。 また、クラス定義はコンパイル時に評価しても問題ないのはなぜなんでしょう? 自分でももう少し勉強してまた質問させていただきます。 回答ありがとうございました。

関連するQ&A

  • 新規ソース内のマクロ定義が既存ソース内のマクロ定義と衝突しない策について

    C言語です。 Effective C++か何かで読んだ const int hoge = 3; const char *bar = "HOGEHOGE"; などを使用しようと思ったのですが、 C言語ではコンパイルする際に、 「関数の外では定数は宣言できません」?? のようなエラーが出てしまいました。 そこでこれらを使用するのは諦めて、 #define~を使って定数を使用しました。 (上記のようなエラーが出てしまうのは、 C言語の仕様上、文法がおかしいからだと 思います。そもそもC++に関する本に 載ってるtipsだし^^;) #defineを使用するように修正して、コンパイルする際に、 既存のソース上のマクロ定義(#define~)と名前が重複するものが いくつか見つかり、修正に手間がかかりました。 マクロ定義なので、スコープという概念は 適用されないと思うので、既存のソースと新規のソースで マクロ定義がバッティングしないようにする策としては どのようなものがあるでしょうか? 今のところ思いつくものとしては以下です。 ・新規のソースに関するキーワードをプリフィックスとして使用する ・新規のソースの末尾で#undefをする。(これは試してないので有効か  どうか自信がありません。) 他に何か有効な策がありましたら教えてください。 よろしくお願いいたします。

  • C# 定数定義

    c#での定数定義についてですが、定数用のclassを定義したのですが この場合、定数を使用する各classで継承をしなくてはいけないですが、もっといいやり方等があれば教えてください。 public abstract class define { public const short NET_BUFF = 1024; } class testMain:define {     :     :

  • PHP5でクラス定数が使えますが

    PHP5でクラス定数が使えますが 以下のようにFで A + Eや A | Eなどとすると、 Parse errorとなります。 クラス定数は数値、文字列、配列のみで、組み合わせは不可という仕様で良いのでしょうか? PHP5の仕様書というものはネット上で存在しているのでしょうか? 英語でも構いませんので、ご存知の方教えてください。 class Test { const A=1; const B="2"; const C=array(3); const E=4; const F=A+E; // ここでエラー } この場合の対策ですが、素直にPHP4のように defineを使えば良いでしょうか?

    • ベストアンサー
    • PHP
  • ユーザ定義関数の引数にクラスのインスタンスを渡すことは可能?

    いつもお世話になっております。 (PHP5.2.5) 質問: ユーザ定義関数の引数に、 「クラスのインスタンス」を渡すことは可能ですか? 例: <?php  //クラスをインスタンス化する。(例:PDOクラス)  $conn = new PDO($dsn,$user,$pass);  //ユーザ定義関数に上記のクラスのインスタンスを与えている  user_func($conn);  //ユーザ定義関数の定義部  function user_func($conn){   $sql = '~SQL文~';   $stmt = $conn->prepare($sql);   :   :処理   :  } ?> 関数に渡すことのできる引数の型について、 なかなか見つけられず、初歩的な質問をしてしまっているかもしれませんが、 どうぞ宜しくお願い致します。        

    • ベストアンサー
    • PHP
  • 「関数が定義されていない」とのエラーが出る

    こんにちは,よろしくお願いします。 何が何だか分からなくて困っています。 IEでは問題なく動くのに,Firefoxだと関数が定義されていないとのエラーが出ます。「<関数名> is not defined 」 スクリプトは,外部ファイル化してあります。キータイプの間違いもありません。何度も確認しました。 function aaa(){  (スクリプト) } を <body onload="aaa()"> のようにして呼び出しています。 いったい,何が悪いのでしょうか? また,Operaだと,「リンク先のスクリプトを読み込むことができません」とのエラーが出ます。 元になるPHPファイルでは, <script type="text/javascript" language="javascript" src="../javascript/AAAAA.js"></script> のようにして呼び出しています。 もちろん,ファイルネームのタイプミスはありません。 ちなみに,スクリプトの内容は,日付関連のコードを記述しています。 試行錯誤している時に,他の日付関連のコードを実行したときに, dayoption is not defined というエラーが出たことがあります。 関数が存在しているのに,定義されていないと出るのは,もしかすると,日付関連の関数等の使い間違いではないかとも考えています。 使っているものは,Date()とgetYear()です。これらのうちのどちらかがFirefoxやOperaだとサポートされていないのでしょうか? どうか御指導ください。よろしくお願いします。

  • 関数内のクラス定義について

    function func_name() { --- snip --- class class_name { --- snip --- } --- snip --- } のように関数内でクラスを定義した例を見たのですが、関数外でクラスを定義した場合とどこが違うのでしょうか? またどのような意味があるのでしょうか? PHPでは関数内に子関数を定義すると子関数もグローバルになって二重定義エラーになるためこのようなことは出来ないと認識しているのですが、関数内でのクラス定義でこのようなことは起こりませんか。 またclass class_nameはグローバルなスコープを持たないのでしょうか?よろしくお願いします。

    • 締切済み
    • PHP
  • 関数の定義

    関数の定義とは ここから 戻り値の型 関数名(引数リスト) {   文;   ・・・   return式; } ここまで のことをいうのでしょうか??あたりまのような質問ですみません。 参考書には、「関数の定義はブロック内にまとめて記述します」 となっているので{ }の中のものだけなのかと思ってしまいました。 初歩的な質問ですがよろしくお願いします。

  • C++:ある関数を定義するときに別の関数を用いて定義はできないのですか。

     Visual C++を使っています。  以下のように関数func2において関数func1を使いたいのですがコンパイルするとポインタがどうのこうのと言ってきます。  書き方が間違っているのでしょうか、別にいい方法がありましたら教えてください。参考書はありますので、どの項目を見ればよいと言うアドバイスでも結構です。 const double a=100.0; //グローバル変数aを定義 //関数func1を定義 double func1(double x){ return exp(x); } //関数func2を定義 double func2(double y){ return func1(a)*exp(y);//func(a)は係数。 } 実際はfunc1とfunc2はもっと複雑な形なのでどうしても別々に定義したいです。

  • perlとphpの共用?

    phpで定義した関数をperlから読み込む、又はその逆をしたいのですが 可能なのでしょうか? たとえばphpの関数をperlが読む場合? phpスクリプト <? $hoge = 'hoge1'; ?> となっていた場合にperlで読む場合にはどうすればいいでしょうか? 又上記の場合が可能である場合に $hoge を const HOGE = 'hode1'; とした場合でも可能なのでしょうか?

    • ベストアンサー
    • PHP
  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

専門家に質問してみよう