三陸牡蠣復興支援プロジェクト「SAVE SANRIKU OYSTER」



定数

定数とは

定数」は、殆ど変数と同じです。しかし二者は、以下の点で異なっています。

変数と定数の相違点
  • 変数が再定義出来るのに対して、定数は再定義が出来ない。
  • 定数は変数の様に名前の前に「$(ドルマーク)」を置かない。
  • 定数にはスコープ規則が無く、何処からでもアクセス出来る。
  • 定数に配列(「配列」のページで解説)は格納出来ない。厳密に言うと、定数に格納出来るのはスカラー値(「配列」のページで解説)のみ。

更に、定数の定義方法は少し特殊です。以下に、定数の定義方法を示したサンプルと結果を。

<html>
<body>
<?php
    define("HODE", "hodenasu!!");
    
    echo HODE;
    echo "<hr />";
    echo hode;
    echo "<hr />";

    define("HODE", "hodenegasu!!");
    
    echo HODE;
    echo "<hr />";
    
    function hode(){
        echo HODE." (function)";
        echo "<hr />";
    }
    
    hode();

    define("NDA", array("ndegasu", "ndenekute"));
?>
</body>
</html>
hodenasu!!

hode
hodenasu!!
hodenasu!! (function)
(エラーメッセージ出力)

まず最初に「define("HODE", "hodenasu!!");」という一文があります。この部分が、定数の定義をしている所です。定数の定義にはこの様に、「define()」という定数を定義するための内部関数を使います。

この「内部関数define()」は、第一引数に「定数名(文字列)」を、第二引数に「定数に格納する値」を、オプション(省略可)で第三引数に「定数名の大文字小文字を区別するか否かを表す真偽値(デフォルトでは「true」つまり区別する)」を指定して使います。

上のサンプルの結果からも判るように、定数の再定義は出来ません(関数の様にエラーにはなりません)。また、デフォルトでは大文字と小文字が区別されています。区別させない場合は、第三引数に「false」を指定します。そして、関数内からでも「修正子global」を使用しないでアクセス出来ます。しかし、定数に配列は格納出来ません。

定義済みの定数

PHPには、既に「定義済みの定数」が存在します。そして、この定義済みの定数には、「PHPにアクセスする前から定義されているもの」と、「PHPスクリプトにアクセスした時点で定義されるもの」とがあります。

更に、「PHPにアクセスする前から定義されている定数」は、「コアの定義済み定数」と「標準の定義済み定数」に分類(詳しくは、本家のマニュアルの「付録」セクション「定義済みの定数」のページをご参照下さい。)されます。

「PHPスクリプトにアクセスした時点で定義される定数」には、以下のものがあります。

定数格納される値
__LINE__この定数が書かれてある行番号
__FILE__ファイル名を含めた絶対パス
__FUNCTION__関数名(PHP4.3.0以上)
__CLASS__クラス名(PHP4.3.0以上)
__METHOD__クラスのメソッド名(PHP5.0.0以上)

注意する所は、定数名が「_(アンダーバー)」2個で囲まれている点です。また、これらは大文字と小文字を区別しません。以下に、サンプルと結果を。

<html>
<body>
<?php
    function line($line = __LINE__){
        echo $line."<hr />";
    }
    
    function func(){
        echo __FUNCTION__."<hr />";
    }
    
    line(__LINE__);
    line(__LINE__);
    line(__LINE__);
    line();
    
    echo __FILE__."<hr />";
    
    func();
    
    class CLS{
        function methd(){
            echo __CLASS__."<hr />";
            echo __FUNCTION__."<hr />";
            echo __METHOD__;
        }
    }
    
    $obj = new CLS();
    $obj->methd();
?>
</body>
</html>
12

13
14
4
/絶対パス/ファイル名.php
func
cls
methd
__METHOD__

執筆時点での当方の環境が「PHP4.3.4」に付き、「__METHOD__」は未定義なので、文字列として出力されています。「クラス」の部分は、「クラス」のページで解説します。その他の説明は省略。

「PHPにアクセスする前から定義されている定数」の「コアの定義済み定数」と「標準の定義済み定数」 には、それぞれ主に、以下のものがあります。いずれも、大文字と小文字を区別します。

「標準の定義済み定数」には主に以下のものがあります。

定数格納される値
PHP_INI_USER1(PHPの設定を、ユーザーのスクリプトで設定可能である事を表す)
LOCK_EX2(「flock()」関数のモード指定に使う)
(その他多数)...

これらの定数に格納されている値は殆ど(全部?)、整数か浮動小数点数です。これらの定数は、PHPスクリプトでのPHPの設定や、PHPに標準で組み込まれている内部関数を使う際のモードの指定に使います。関数のモード判定は、実際には数値の値で判定されていますが、数値のままだと視認性に欠けるので、視認性を高めるために、解かり易い名前を付けた定数に、値を定義しているというものです。

「コアの定義済み定数」には主に以下のものがあります。

定数格納される値
PHP_VERSION4.3.4等(インストールされているPHPのバージョン)
PEAR_INSTALL_DIR/場所/pear(「PEAR(PHPのライブラリ)」が置いてある場所)
E_WARNING2(スクリプト実行時に発生した警告を表す)
(その他多数)...

これらの定数には、サーバにPHPをインストール・設定した時点で決定する情報などが格納されています。多分(オイ)。

定数を確実に得る方法

PHPでは、未定義の定数を参照しようとすると、それを文字列として扱ってしまいます。存在しない定数を参照して文字列が出力されるの避けたい場合は、以下のようにする事が出来ます。

<html>
<body>
<?php
    define("CONST", "hodenasu!!");
    
    echo constant("CONST")."<hr />";
    
    echo constant("CONT")."<hr />";
    
    if(defined("CONT")){
        echo CONT;
    }
?>
</body>
</html>

結果は以下のようになります。

hodenasu!!

(警告メッセージ出力)

サンプルコードの中の「constant("CONST")」は、「指定された名前の定数の値を出力する、未定義なら警告を発生させる」という処理をする関数です。

また、「defined("CONT")」は、「指定された名前の定数が定義されているか否かを真偽値で返す」という処理をする関数です。

これで、未定義の定数を参照しても、定数名が文字列として出力される事はありません。

おさらいと予告

以上で、定数の解説は終わりです。

定数とは

  • 定数は再定義が出来ない。
  • 定数にはスコープ規則が無く、何処からでもアクセス出来る。
  • 定数に格納出来るのはスカラー値(「配列」のページで解説)のみ。
  • 定数の定義は、「define("定数名", 値);」という関数を使って行う。

配列だっちゅーの

次回は、特殊な変数、「配列」を解説します。配列には、複数の値を格納出来ます。

作成日:2004年05月16日 最終更新日:2004年05月16日
【印刷モード風モード で表示】