Java
PHP
入門
spring-boot

PHP 変数について調べてみた

前提(学んであること)

  • 数ヶ月ほどJavaを学んだ
  • CSS、JavaScriptも少し学習した
  • Pythonはほんの少し触れた程度
  • PHPは触れたことないです

調べたこと

以下の内容はPHPマニュアルより引用してます。

  • まずPHPファイルは <?PHP で始まり ?> で終わる
  • 原則、1変数に1スコープ
PHPファイル
<?php
$a = 1;
include 'b.inc'; /*includeやrequireにより読みこまれたファイルでも$aが使える。*/
?>

変数$aはインクルードされた b.inc スクリプトの中でも利用可能

  • グローバル、ローカルといったスコープの範囲がある
スコープ範囲
<?php
$a = 1; /* グローバルスコープ */ 

function test()
{ 
    echo $a; /* ローカルスコープ変数の参照 */ 
} 

test();
?>

↑でtest()を実行しても何も表示されない。
(あくまでも、異なるスコープだから。)


・メソッド内でグローバルスコープ変数を使うならglobalキーワードを使う

globalキーワード
<?php
$a = 1;
$b = 2;

function Sum() 
{
    global $a, $b;
    $b = $a + $b;
} 

Sum();
echo $b;  /*$b=3*/
?>

↑自分の理解:定義されてるグローバルスコープを使うための合言葉?

・globalキーワードの代わりに$GLOBALSも使える

$GLOBALS
<?php
$a = 1;
$b = 2;

function Sum() 
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
} 

Sum();
echo $b;
?>

$GLOBALSはスーパーグローバルというらしい。なにそれ。。。

$GLOBALS
(PHP 4, PHP 5, PHP 7)

$GLOBALS — グローバルスコープで使用可能なすべての変数への参照

説明
スクリプトのグローバルスコープに現在定義されているすべての変数への参照を含む連想配列です。 変数名が配列のキーとなります。

スーパーグローバル使用例
<?php
function test() {
    $foo = "local variable";

    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
    echo '$foo in current scope: ' . $foo . "\n";
}

$foo = "Example content";
test();
?>

出力結果
$foo in global scope: Example content
$foo in current scope: local variable

つまりはグローバル変数 $fooに代入すると、メソッド内とか関係なく全ての $GLOBALS["foo"]
値が代入される?
(Javaだとprivateついてるとsetter必須だから、簡単に代入できちゃうと怖い気が、、、)

・スーパーグローバルはglobal宣言いらない、それ以外はglobal宣言必要

スーパーグローバルとグローバル
<?php
function test_global()
{
    // ほとんどの定義済み変数は"スーパー"ではなく、関数内の
    // ローカルスコープで有効とするには'global'をコールする必要があります。
    global $HTTP_POST_VARS;

    echo $HTTP_POST_VARS['name'];

    // スーパーグローバルはどのスコープでも有効であり
    // 'global'をコールする必要がありません。
    // スーパーグローバルはPHP4.1.0以降で利用できます。
    // HTTP_POST_VARS は今や非推奨とされています。
    echo $_POST['name'];
}
?>

・静的変数(static)

静的変数はローカル関数スコープのみに 存在しますが、プログラム実行がこのスコープの外で行われるようになっ てもその値を失わないません。

static変数
<?php
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}
?>

↑staticがないと、test()が呼び出されるたびに$a=0で初期化される。
staticがあると、test()が呼び出されれば$a++$aの値が増えていく。

・再帰的な関数

再帰的関数
<?php
function test()
{
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        test();
    }
    $count--;
}  /*$countは1,2,3,...,9,10と増えていく*/
?>

↑こちらもstaticがないと、毎回$count=0で初期化される。

ちなみに、、、static変数宣言のしかたに注意!

static変数の宣言
<?php
function foo(){
    static $int = 0;          // 正しい
    static $int = 1+2;        // 正しい(ただし、PHP 5.6 以降に限ります)
    static $int = sqrt(121);  // 間違い(関数を使っています)

    $int++;
    echo $int;
}
?>

まとめ

変数について調べたけど、意外とすんなり理解した。
ただ、スコープの範囲を常に意識しないと混乱しそう。
PHP使うかはわかんないけど。。。

今後も自分なりにまとめて書いていこう。