チャチャッとPHPブログ

初心者むけプログラミング・PHP学習
2020/07/11

【STEP 8】PHPを学ぼう 可変長引数 / 複数の戻り値 / スコープ


STEP 8

今回は少し変わった使い方の紹介になります。

基礎知識ではあります。しかし、実技としておそらく使うことはあまりありません。

Web業界で働くレベルの会話の中にはでてきます。
ややランク上のPHP入門になります。

しかし、フレームワークなど有識者のコードを読んでる時にでてくるかもしれません。
何をしているのか分からずビックリしないためにお役立てください。

28
可変長引数
...をつける引数

◎慣れてからつかおう
この内容は、はじめのうちは、特に意識しなくとも大丈夫です。そういうのもあるんだなぁ程度で構いません。すぐ理解できなくとも、前にすすめましょう。

関数の引数に「...」をつける形式の関数があります。

これは引数の数を変動的につけることができる方法です。
このときの変動的な引数を「可変長引数」といいます。

以下のような形式で使われます。サンプルコードをみてみましょう。

サンプルコード

<?php

function sum(...$kazu) {
    $acc = 0;
    foreach ($kazu as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);

?>

実行結果

10

サンプルコードの解説

...$kazu のように、引数の先頭に ... をつけています。

sum関数へ引数を(1, 2, 3, 4)と渡すのですが、受け取る $kazu は配列になります。[1, 2, 3, 4]がはいってきます。

foreach文で$kazuからひとつずつ値を取り出し、$nにはいります。そして、$accに加算されていきます。

(1, 2, 3, 4)のすべてを加算した $acc を返します。

今ままでの関数では、引数の数は決まっていました。...をつけることで、決まった数ではなく、いくつも渡すことができます。そして、その値は配列型で渡ってきます。

あまりつかうことはないかもしれません。
こんな使い方もできるんだなーぐらいで頭のどこかにとどめておいてください。

29
複数の戻り値を
とってみよう

◎慣れてからつかおう
この内容は、はじめのうちは、特に意識しなくとも大丈夫です。そういうのもあるんだなぁ程度で構いません。すぐ理解できなくとも、前にすすめましょう。

関数の戻り値は1つでなく、複数取得することもできます。サンプルコードをみてみましょう。

サンプルコード

<?php

function sakana()
{
    $v1 = 'saba';
    $v2 = 'tai';

    return array($v1, $v2);
}

list($sushi1, $sushi2) = sakana();

echo $sushi1 . "<br/>\n";
echo $sushi2;

?>

実行結果

saba
tai

サンプルコードの解説

複数の戻り値をとるためにlist関数を使います。list関数は複数の変数への値をいれる関数です。

呼び出している sakana() は戻り値として2つの変数 $v1, $v2 を返しています。
返すときにはarray()をつかった配列型で返します。

list関数と return array() 組み合わせて使うことで、2つの値をうけとることができます。

こちらもまた、変わった使い方です。誰かのコードをみるときに出てくるかもしれません。

30
変数の
スコープ

◎慣れてからつかおう
この内容は、はじめのうちは、特に意識しなくとも大丈夫です。そういうのもあるんだなぁ程度で構いません。すぐ理解できなくとも、前にすすめましょう。

関数の中にある変数は、関数の外から使うことはできません。

変数には使える範囲があります。
スコープとはこの「変数などが使える範囲」を意味します。

サンプルコードをみてみましょう。

サンプルコード

<?php

function func1()
{
   $val = 'ローカルスコープ';
   return $val;
}

echo func1();
echo $val;

?>

実行結果

ローカルスコープ

サンプルコードの解説

echo func1(); は ローカルスコープを表示しています。echo $val; は何も表示されません。

変数は使える範囲「スコープ」が設定されています。func1()の変数$valは「ここの関数の中だけ」と設定されます。

変数$valのスコープは関数func1()の中になります。関数内の変数$valは外では使えません。

関数の中のみ有効なスコープを「ローカルスコープ」その変数を「ローカル変数」といいます。
ローカルとは限られた場所という意味です。

◎変数の使える範囲を知ることがナゼ重要なの?

プログラムの処理をつくってゆくなかで、変数の名前が重なってしまうと、処理が正しく行えません。

関数の中であれば影響を受けたり、与えたりせず安全につくることができます。

その上で、一般的に、スコープに合わせた「変数の名前のつけ方」をして、変数がどこまで使えるかを一目でわかるように分けています。

変数の名前の付け方でスコープ(変数の使える範囲)が一目でわかると、コードが読みやすくなります。
読めると、既存のコードの調子に応じたコードを書くことができ、「わかりやすさ」の協力につながります。

プログラムは他の人が読んだり追ったりするため、「わかりやすさ」は仕事をはやく進めることができ、重要です。

変数のスコープの理解して、適切にコードを書くことは、使いやすく、読みやすさの差になります。

長く時間がかかるプログラム開発・運用活動において、大きなメリットになってきます。

ただ、使いこなすはまだ先の話なので、さっと触れる程度で今はかまいません。



(補足)グローバル変数
関数内の変数を外でも利用することができます。
global とあらかじめ宣言する方法です。

サンプルコードをみてみましょう。

サンプルコード

<?php

$val = "ぼくです";

function func1()
{
   global $val;
   $val = 'わたしです';
}

echo func1();
echo $val;

?>

実行結果

わたしです

サンプルコードの解説

はじめに書いた$valの ぼくです は表示されません。上書きにより、消されています。
func1関数内で global で$valが宣言されたため わたしです に上書きされ外でも残っていきます。

globalは変数をどこでも上書きできます。
使い方によっては、バグ(不具合)を生む原因になります。

そのためglobalを安易に使うのはおすすめしません。

どこでどの値に変化したのか追うのが大変困難になるため、あまり使わないほうがいいでしょう。

(補足)スーパーグローバル変数
どこでも使用できるPHPで組み込まれた特別な変数です。
global を宣言しません。特定の文字列の変数です。

スーパーグローバル変数には以下の種類があります。

$GLOBALS
スクリプト全体を通してすべてのスコープで使用することができます

$_SERVER
Web サーバーから提供されるヘッダ、パス、スクリプトの位置などの情報を有する配列です

$_GET
URLパラメータとして送信される値を取得します

$_POST
HTMLフォームで送信された値を取得します

$_FILES
ファイルをサーバーにアップロードする際にデータを受信します

$_COOKIE
クッキーから渡された変数の連想配列です

$_SESSION
セッション管理に使用します

$_REQUEST
$_GET $_POST $_COOKIE の内容をまとめた連想配列です

$_ENV
環境変数です。ドキュメントルートのルートディレクトリやサーバーのIPアドレスなどの環境情報を取得することが出来ます


これらは連想配列になっており、それぞれに役割をもっています。
他の配列と同様に利用することが出来ます。

主に参照して使われます。

記事

カテゴリ

About me

Name : sin (@Sin_Programming)
ディレクター | プログラマ | プログラム開発15年目 | PHP/JavaScript/Swiftが好きです。 プログラミング初心者の方向けのPHP学習iPhoneアプリ「チャチャッとPHP」を作成しました。 PHPプログラムをムダなく学習できる方法としてまとめています。
iPhoneアプリ「チャチャッとPHP」8日で覚えるPHP