コンテンツにスキップ

変数・スコープ

はじめに

本サイトにつきまして、【IT技術の知見】はじめに - 俺の技術ノート をご認識のほど宜しくお願いいたします。


01. 定数

定数が役に立つ場面

▼ フラグ ON/OFF

<?php

declare(strict_types=1);

/**
 * フラグ定数クラス
 */
final class FlagConstant
{
    /**
     * フラグが立っている状態
     */
    public const IS_ON = true;

    /**
     * フラグが立っていない状態
     */
    public const IS_OFF = false;
}

▼ 区分値

区分名(A_TYPE、B_TYPE、C_TYPE)を integer 型の定数として扱う。

DB レコード区分名をそのまま保存してもよいが、区分名が変わったときにアプリケーションの実装だけでなく DB レコードを変更するのが大変である。

その一方で、DB は区分名ではなく区分値として管理しておけば、DB レコードを変更せず、アプリケーションだけを変更すればよい。

▼ 数値計算、数値比較

計算処理や数値比較処理では、可読性の観点から、できるだけ数値を直書きしない。

数値に意味合いを持たせ、定数として扱うと可読性が高くなる。

▼ URL

URL を文字列を定数として扱う。


場面に応じた命名

意味づけ 名前 型
個数、回数 NUM_***** int
最大数、最小数 MAX_NUM_*****、MIN_NUM_***** int
URL URL_***** string


マジカル定数

自動的に値が格納されている定数。

▼ __DIR__

この定数がコールされたファイルの配置ディレクトリパスは、ルートディレクトリ基準で格納されている。

以下の実装を持つファイルを、/var/www/foo ディレクトリ下に配置しておき、/vendor/autoload.php ファイルと結合してパスを通す。

<?php

# /var/www/foo/vendor/autoload.php
require_once realpath(__DIR__ . "/vendor/autoload.php");

▼ __FUNCTION__

この定数には、コールされた関数名が格納されている。

<?php

class Foo
{
    public function foo(): void
    {
        echo __FUNCTION__;
    }
}
<?php

class Foo
{
    public function foo(): void{}
}

$foo = new Foo;
$foo->foo(); // foo が返却される。

▼ __METHOD__

この定数がコールされたクラス名と関数名が、{クラス名}::{関数名} の形式で格納されている。

<?php

class Foo
{
    public function foo(): void
    {
        echo __METHOD__;
    }
}
<?php

$foo = new Foo;
$foo->foo(); // Foo::foo が返却される。


02. 変数

変数展開

文字列のなかで、変数の中身を取り出すことを『変数展開』と呼ぶ。

※Paiza で検証済み。

▼ シングルクオーテーションによる変数展開

シングルクオーテーションの中身はすべて文字列として認識され、変数は展開されない。

<?php

$fruit = "リンゴ";

// 出力結果
echo 'これは$fruitです。'; // これは、$fruitです。

▼ シングルクオーテーションと波括弧による変数展開

シングルクオーテーションの中身はすべて文字列として認識され、変数は展開されない。

<?php

$fruit = "リンゴ";

// 出力結果
echo 'これは{$fruit}です。'; // これは、{$fruit}です。

▼ ダブルクオーテーションによる変数展開

変数の前後に半角スペースを置いた場合にのみ、変数は展開される。

(※半角スペースがないとエラーになってしまう)

<?php

$fruit = "リンゴ";

// 出力結果
echo "これは $fruit です。"; // これは リンゴ です。

▼ ダブルクオーテーションと波括弧による変数展開

波括弧を使用すると、明示的に変数として扱える。

これによって、変数の前後に半角スペースを配置しなくとも、変数は展開される。

<?php

$fruit = "リンゴ";

// 出力結果
echo "これは{$fruit}です。"; // これは、リンゴです。


参照渡しと値渡し

▼ 参照渡し

『参照渡し』とは、変数に代入した値の参照先 (メモリアドレス) を渡すこと。

<?php

$value = 1;
$result = &$value; // 値の入れ物を参照先として代入

変数の $b には、$a の参照によって 10 が格納される。

<?php

$a = 2;
$b = &$a;  // 変数aを&をつけて代入
$a = 10;    // 変数aの値を変更

// 出力結果
echo $b; // 10

▼ 値渡し

『値渡し』とは、変数に代入した値のコピーを渡すこと。

<?php

$value = 1;
$result = $value; // 1をコピーして代入

変数の $b には、$a の1行目の格納によって 2 が格納される。

<?php

$a = 2;
$b = $a;  // 変数aを代入
$a = 10;  // 変数aの値を変更

// 出力結果
echo $b; // 2