株式会社ラクス  ITエンジニア総合支援サイト スタックアスタリスク フルマネージド専用サーバー エクスユニット
ITエンジニアとして 知る 学ぶ
 
Java
.NET
PHP
プログラミング一般
DataBase
システム/サーバ構築
システム/サーバ運用
技術系一般知識
 
 
>IT技術情報>php>PHP第1回:PHP基礎
【連載 】PHP

第1回:PHP基礎

 

【 ページ 】 | 1 | 2 | 3 | 4 |


<<前のページへ

4.関数


この章では関数に関するお約束事を紹介します。

関数とは、決まった処理をプログラムの別のところに記述しておき、使う際に(関数呼び出しといいます)、パラメータを渡したりすることができます。また、関数から関数内で処理した結果の値を関数の呼び出し元に返すことができます。それを関数の戻り値(返り値)といいます。




■基本

関数の宣言は下記のようにします。
 
1: function hoge($arg) {
2:   return $arg . "<br>";
3: }


関数を呼び出すときは、$str = hoge("abc") のような形で呼び出し、左記の例だと、$str に文字列「abc<br>」が代入されます。



■参照渡し

PHPでは、関数の引数として、参照渡しがサポートされています。追って説明してきますが、まずは書式を。
 
 1: function foo($arg) {
 2:   $arg = "FOO FUNC.";
 3: }
 4
 5: function hoge(&$arg) {
 6:   $arg = "HOGE FUNC.";
 7: }
 8
 9: $val = "This is a pen.";
10: foo($val);
11: echo $val;
12
13: $val2 = "This is a book.";
14: hoge($val2);
15: echo $val2; 


上記、foo 関数は通常の関数宣言、hoge 関数が参照渡しの宣言です。上記コードの出力結果は、「This is a pen.HOGE FUNC.」となります。

つまり、foo 関数は引数が「値(This is a pen.)」として渡されたのに対し、 hoge関数は引数が格納されている場所の「アドレス」が渡されています(という説明ではピンときませんよね。。。)。

別の言葉でいうと、foo 関数のような通常の呼び出し方では、$val の内容が変更できないのに対し、hoge 関数のような参照渡しの場合は $val2 の内容が変更できてしまうということです。

内部処理としては、foo 関数では、引数で渡された値を格納する用のメモリ領域を確保し、そこに引数の値をコピーします。従って、関数内での $val の値の変更は、この新たに確保した領域の値に対して行われます。対して、参照渡しの hoge 関数では、$val の値の変更は、元の値の変更を意味します。

大量のデータ(数MBとか)を関数の引数として渡したい場合などを除き、参照渡しを使わなくても十分実用的なプログラムが作れると思います。
通常の関数呼び出しでは値がコピーされて関数に渡されています。したがって、メモリの量も倍必要なのです(メモリの内容をコピーするのにかかる時間も無駄ですね。)。参照渡しの場合はアドレス(に相当するもの)が渡されますので、メモリはごく少量ですみます。違い、わかっていただけましたでしょうか?


■デフォルト値

関数呼び出しの際、本来あるべき引数が省略された場合にとる値(デフォルト値)を設定できます。デフォルト値の設定は、関数の宣言の際、下記のように書いてやることで実現できます。
 
1: function hoge($arg="NO VALUE!") {
2:   echo $arg;
3: }
4: hoge("HOGE!");
5: hoge();


上記プログラムは、「HOGE!NO VALUE!」を出力します。

まぁ、使わなくてもよいでしょう。逆に、使いすぎるとプログラムの意味がわかりにくくなる場合があるかもしれません。

ただ、すでにいくつものスクリプト中で使っている関数に引数を追加したい時なんかには有効かもしれません。普通だと、すべての関数呼び出しをしている個所を探し出し、引数を追加してやらなければならないのですが、デフォルト値を用いることによって、修正量が少なくてすみます。


■スコープ

まず、下記のコードを見てください。結果はどうなると思いますか?
 
1: $a = "abc";
2: function hoge() {
3:   echo $a;
4: }
5: hoge();


上記、何も出力されません。どうしてでしょうか?原因は、変数・配列の章でも書きましたが、関数内からは、グローバル変数 $a にアクセスできないからです。所望の結果を得るためには、
 
1: $a = "abc";
2: function hoge() {
3:   global $a;
4:   echo $a;
5: }
6: hoge();


のように $a がグローバル変数であることを宣言(3行目)してやらねばなりません。(もしくは、echo $GLOBALS["a"]; とする方法もあります。)

ちなみに、下記のプログラムは、「123abc」を出力します。
 
1: $a = "abc";
2: function hoge() {
3:   $a = "123";
4:   echo $a;
5: }
6: hoge();
7: echo $a;



▼Java や Linux を体系的に学びましょう!▼
Stack*のラクスが、
新学習方式のカリキュラムを開発しました!
14700円から(*1)、Java や Linux を体系的に学べます!!
(*1 テキスト代のみの税込料金です)




つまり、global 宣言されていない場合、関数内の $a と、グローバル変数 $a は全く別のものなんですね。


●この記事はあなたのお役に立ちましたか?
非常に役に立った
役に立った
どちらでもない
役に立たなかった
全く役に立たなかった

●ご意見・ご感想があればご記入ください。



【 目次 】
1.はじめに
2.変数・配列
3.制御構造
4.関数

【 関連記事 】
PHP
第1回:PHP基礎
第2回:PHP中級
第3回:PHP応用

サイト内全文検索
スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。


簡単レンタルメールフォーム
300メガ1000円〜 XBitのレンタルサーバー
500メガ1995円〜 電話サポート/PostgreSQL/専用SSLなどにも対応!お客様のニーズを網羅したレンタルサーバ
ホームページ制作のアシストウェブ
STACK* 執筆の講師陣から習得する!! ITエンジニアスクール アイティブースト
統合メールサポートシステム 〜MailDealer(メールディーラー)〜
システム開発,IT教育 〜株式会社アイティーブースト(ITBoost)〜
簡単 営業支援/顧客管理ツール Easy Sales
  利用規約 お問い合わせ・ご意見 スタックアスタリスクについて 運営会社について 
  レンタルサーバー ホスティング 専用サーバー メールフォーム ショッピングカート メール共有 ITエンジニア派遣 Linux講座 Java講座 メール配信 レンタルサーバー Webデータベース 検索サービス
CopyrightcRAKUS Co.,Ltd. All Rights Reserved.  メール管理・共有 顧客管理(CRM)もできるメール対応サポートシステム JAVA LINUX CISCO 技術者派遣 育成事業 株式会社ラクス