PHP入門

PHPとは

PHPはサーバーサイドで動作するプログラミング言語です。
文法はわかりやすさ、習得のしやすさを重視して作られており、初心者でも習得しやすいと言われています。
一方で、PHP5以降では本格的なオブジェクト指向プログラミングが可能になり、大規模開発でも多く使われています。
また多くのライブラリやフレームワークが存在するため開発の手助けになります。
2012年の2月6日にIDC Japanが発表した「国内ソフトウェア開発者の実態調査」によれば、国内で最も使われているスクリプト言語だそうです。
PHPを設置する方法はPHPが動作するサーバーに、HTMLと同様にアップロードするだけです。拡張子はphpとなります。

ローカルサーバー

先述した通り、javascriptがクライアントサイドである事に対して、PHPはサーバーサイドのプログラミング言語です。
PHPが動作するサーバーにファイルをアップロードするだけでいいのですが、サーバーの環境を簡単に用意できない人もいると思います。
そんな時に使用するのがローカル開発サーバーです。ざっくり言ってしまえば、自分のPCをサーバーに見立てるということです。
以下にローカル開発環境を構築する方法を示します。

XAMPPのインストール【Windowsをお使いの方】

Windowsでローカル開発環境を構築するにはXAMPP(ザンプと読む)というアプリケーションがオススメです。
XAMPPのダウンロードページ へ行き、インストールしてください。
インストール場所はデフォルトのままにしておくことがオススメです。
インストールが完了したら、Xampp Control Panelを起動し、ApacheとMySQLの横の「Start」をそれぞれ押してください。
正常に起動することができたら、ブラウザを開いて「localhost」にアクセスしてみてください
「c:/xampp/htdocs」に置かれたファイルを実行する事ができるはずです。

もし正常にStart出来ない場合はポート番号を変える必要があります。
  • 「C:xamppapacheconf」の「httpd.conf」を開きます。
  • 「httpd.conf」内の「Listen」を変更したいポート番号に変更する。
  • 「httpd.conf」内の「ServerName」の番号も変更したいポート番号と同じにする。
この手順を終えた上でもう一度Startしてみてください
正常に起動することができたら、ブラウザを開いて「localhost:変更後のポート番号」にアクセスしてみてください。
表示されれば成功です。

MAMPのインストール【Macをお使いの方】

Macでローカル開発環境を構築するにはMAMP(マンプと読む)というアプリケーションがオススメです。
MAMPのダウンロードページ へ行き、画面中央付近にあるオレンジ色のDownloadボタンを押してダウンロードして下さい。
ダウンロードが完了したらファイルを解凍し、拡張子.pkgのインストーラファイルをダブルクリックしてインストールを進めてください。
インストールが完了したら、アプリケーションフォルダ内にあるMAMPフォルダからMAMP.appを起動し、「サーバーを起動する」ボタンを押してブラウザが自動的に開けば準備は完了です。
デフォルトの設定ではおそらく、MAMPを起動した状態でブラウザにlocalhost:8888と入力すれば、/Applications/MAMP/htdocsに置かれたファイルを実行する事ができるはずです。
分からない事があったら、MAMPのインストールを解説しているページ などを参考にしてみましょう。

PHPの文とコメント

PHPブロック

PHPは全て「<?php」で始まり「?>」で終了するPHPブロックの内側で実行されます。
終了タグは必要ある場合のみ書いてください。
PHPブロックの外側はそのまま出力されます。
<?php
echo "PHPブロックの中に書かれた内容がPHPプログラムとして実行されます。";
?>
終了タグは省略可能であれば省略します。

PHPの設定情報を出力する

<?php
phpinfo();
上記のプログラムをそのままコピーして、PHPという拡張子をつけて保存します。
次にブラウザを開いてWebサーバー経由でそのファイルにアクセスしてみてください。
PHPが正常に動作していれば、PHPの設定情報が表示されるはずです。
もし、表示されない場合はもう一度設定を見なおしてみてください。

<?php
echo 'PHPは文末に「;」を書きます。';
echo '途中に改行や
        スペースがあっても無視されます。';
PHPは文の区切りにセミコロンを使用します。
途中で行が変わったりスペースが入っていても無視されます。

コメント

<?php
echo 'ここはコメントではありません'; //ここが1行コメントです。
echo 'ここはコメントではありません'; #ここも1行コメントです。
echo 'ここはコメントではありません';/* ここからブロックコメントです。
ここもコメントです。
ここまでコメントです。*/
echo 'ここはコメントではありません';
//ここはコメントです。?>PHPブロックの外側にはコメントは適応されません。ここはそのまま出力されます。
PHPでは1行コメントと、複数行に渡るブロックコメントを使用することができます。

出力

<?php
echo 'PHPで出力するときはechoを使います。';
?>
PHPでCLIやブラウザで出力するときは、基本的にechoを使います。

エラー設定

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
error_reportingは表示するエラーのレベルを指定することができる関数です。
PHPを学習するときは、全てのエラーが表示されるように、E_ALLを指定しておきましょう。
またini_set(‘display_errors’, ‘On’);と書くことでエラーを画面に出力することができます。
ただし、実際に公開するときには適切なエラーレベルに設定する必要があります。

変数とスコープ

変数

<?php
$var  = '全てのPHPの変数は必ず先頭に$がつきます。';
?>
PHPの変数は先頭に$をつきます。大文字と小文字が区別されます。

スコープ

PHPでは関数やメソッド内ではその外側で定義された変数を使用することはできません。
また、関数やメソッド内で定義された変数をその外側で使うことができません。これをローカルスコープと言います。
関数やメソッドの外側で定義された変数はグローバル変数となり、全ての場所で利用、書き換えることができます。

スーパーグローバル変数 $_POST $_GET

PHPには予め自動的に定義される変数があります。PHPでは定義済みの変数を書き換えることもできますので注意してください。
定義済みの変数にはスーパーグローバル変数という、全てのスコープから参照可能な変数も存在します。
スーパーグローバル変数には例えば、HTTP POSTで渡された内容を含む$_POSTなどが存在します。

PHPでは型を宣言する必要はありませんが、全ての変数が型を持っています。型は代入された内容に応じて自動的に割り当てられます。
また、PHPでは型が自動的に変換されることがあります。

整数型(int)

整数型は10進法の他に8進法、16進法に対応しています。
<?php
$i = 18;

倍精度浮動小数点型(double)

倍精度浮動小数点型とは整数型で表すことができない実数を入れる型です。
<?php
$d = 4.015;

文字列型(string)

PHPでは多くの場合、文字列型を使います。
<?php
$a = '文字列型';
$b = "文字列型";
文字列を代入するときは、シングルクォーテーションまたはダブルクオーテーションを使います。
ダブルクオーテーションの中ではエスケープ文字や変数が展開されますが、シングルクォーテーションの中では展開されません。
<?php
$a = '文字列型';
$b = "文字 $a 列型";
echo $b;
これを実行すると、「文字 文字列型 列型」と出力されますが
<?php
$a = "文字列型";
$b = '文字 $a 列型';
echo $b;
この場合は「文字 $a 列型」となります。
<?php
$a = 'う';
$b = "あい$aえお";
echo $b;
この場合、「あいうえお」が出力されることが期待されるのですが、変数「$aえお」が存在しないというエラーになってしまいます。
このようなことを防ぐために
<?php
$a = 'う';
$b = "あい{$a}えお";
echo $b;
このように{}で変数を囲むようにしましょう。

論理型(bool)

true/falseの真偽値を入れておく型です。
<?php
$flag = true;

配列型(array)

複数の値を代入することができます。
$配列変数名 = array(キー => 値, キー => 値, キー => 値, );の形式で可能です。
<?php
$a = 'りんご';
$fruits = array('banana' => 'バナナ', 'orange' =>  'オレンジ', 'apple' => $a, 'peach' => '桃');
一つの配列に複数の型が混在しても構いません。
PHPは全て連想配列ですが、キーを指定する必要はありません。
<?php
$fruits = array('バナナ', 'オレンジ', 'りんご', '桃');
$fruits2 = ['バナナ', 'オレンジ', 'りんご', '桃']; //PHP5.4以降
このように表記することもできます。この場合は
<?php
$fruits = array(0 => 'バナナ', 1 => 'オレンジ', 2 => 'りんご', 3 => '桃');
と同じ意味になります。
配列の中の値を利用するには、「配列変数名[キー]」のようにして取り出します。
<?php
$fruits = array(0 => 'バナナ', 1 => 'オレンジ', 2 => 'りんご', 3 => '桃');
$apple = $fruits[2]; // 変数appleには'りんご'が代入される。
配列の中に配列を入れることも可能です。それを多次元配列といいます。
<?php
$apple = array('青りんご', '赤りんご', '緑りんご');
$fruits = array(array('オレンジ', '蜜柑', '柚子'), $apple);
$blueApple = $fruits[1][0];//青りんご
$orange = $fruits[0][0];//オレンジ

null型

値を持っていないことを意味します。nullを代入するか、値が代入されていない場合にnullとなります。

キャスト

下記の場合、自動キャストが発生します。
異なる型同士で演算を行う場合
特定の型でしか出来ない処理に、異なる型が与えられた場合
また、文字列型でも処理する双方の値の中身が数字の場合は整数型や倍精度浮動小数点型に自動でキャストします。
<?php
if ('007' == '7.0') {
    echo '同じです';
}
if (50.0 == "050plus") {
    echo '同じです';
}
これらは全て「同じです」と表示されます。自動キャストは便利ですが、使い方を間違えるとバグを生む可能性があります。
「050plus」というパスワードを設定してたのに、「50」と入力するだけで、入れたら深刻な問題です。
比較をするときはなるべく型まで比較するイコール3つ「===」を使いましょう。

var_dump()

変数の中身や型を確認したいときはvar_dump()を使いましょう。
<?php
$a = 'apple';
var_dump($a);//string(5) "apple"
var_dumpに$aを入れると、string(5)”apple”のように出力されます。

演算子

代入演算子

左辺の値を右辺の値と同じにします。
<?php
$a = 'apple';

代数演算子

加算 +
減算 -
乗算 =
除算 /
剰余(割ったあまりを返す) %
<?php
$a = 1 + 2;
echo $a //3

複合演算子

複合演算子は演算した結果を元の変数に代入したい場合に使います。
使い方は「左辺 演算子= 右辺」です。
<?php
$a = 1;
$a += 2;
echo $a //3
定型的な演算子もあります。
インクリメント(整数型の値に1を足す) ++
デクリメント(整数型の値から1を引く) - -
※デクリメントはマイナス2つ

「$a++;」は「$a += 1;」と同意義になります。
<?php
$a = 3;
$a++;
echo $a //4

比較演算子

左辺と右辺が等しい場合はtrue(型は比較しない) ==
左辺と右辺が等しく型が一致した場合はtrue ===
左辺と右辺が等しくない場合はtrue(型は比較しない) !=
左辺と右辺が型まで含めて等しくない場合はtrue !==
右辺が左辺より大きい場合true <
左辺が右辺より大きい場合true >
右辺が左辺以上の場合true <=
左辺が右辺以上の場合true >=

論理演算子

論理積 (両辺ともにtrueならtrue) &&、and
論理和 (どちらかがtrueならtrue) or 、||
排他的論理和 (片方がtrueで、もう片方がfalseの場合true) xor
否定 (falseならtrue) !
<?php
$a = true;
$b = false;
$c = true;
if ($a && $c) {
    echo '真';
}
if ($a || $b) {
    echo '真';
}
if ($b xor $c) {
    echo '真';
}
if (!$b) {
    echo '真';
}
上記は全てtrueになります。

文字列演算子

PHPでは文字列を繋げるときは「.」を使います。
<?php
$a = 'あい';
$b = 'えお';
$c = $a . 'う' . $b;
echo $c; //あいうえお

制御構造

PHPの制御構造

if文、switch文、for文、while文はJavascriptとほぼ同じです。
ただし、PHPではelse ifをelseifと省略できるなど多少の違いはあります。
また、PHPの制御構造は同じファイルであれば、PHPブロックを超えて継続します。
<?php
if (true) {
?>
この部分はif文がtrueのとき以外は出力されません。
<?php
} else {
?>
この部分はif文がfalseのとき以外は出力されません。
<?php
}

if文(条件分岐)

if文は「もし条件ならば、処理◯◯を実行する。条件でなければ、処理××を実行する」という制御構造です。
<?php
$a = 10;          // 変数aに、10を代入
if ($a % 2 == 0) {        // もし変数aを2で割った余りが0であれば、以下の処理を実行
    echo "偶数";     // 「偶数」と出力
} else {               // 上記条件に当てはまらなければ、以下の処理を実行
    echo "奇数";     // 「奇数」と出力
}

switch文

switch文は与えられた変数の値によって処理を分岐する方法です。
caseの後に想定する変数の値を記述し、case毎に処理を記述します。
実行時に変数に渡された値と、caseの後に記述した値が一致すると処理が実行されます。
それぞれの処理の終了部分には「break;」を記述します。
「break;」が記述されていないと以下に続く処理が続いて実行されてしまいますので気をつけましょう。
<?php
$science = 'chemistry';                            // 変数scienceを定義し、chemistryという文字列を代入
switch ($science) {
    case 'physics':                                   // 変数scienceの値がphysicsであれば以下の処理を実行
        echo "私は物理が好きです。";          // 「私は物理が好きです。」と表示する
        break;                                       // switch文を終了
    case 'biology':                                  // 変数schienceの値がbiologyであれば以下の処理を実行
        echo "私は生物が好きです。";         // 「私は生物が好きです。」と表示する
        break;                                       // switch文を終了
case 'chemistry':                                // 変数schienceの値がchemistryであれば以下の処理を実行
        echo "私は化学が好きです。";         // 「私は化学が好きです。」と表示する
        break;                                      // switch文を終了
default:                                    // 変数scienceの値がphysicsでもbiologyでもchemistryでもない場合以下の処理を実行
        echo "私は理科が好きです。";        // 「私は理科が好きです。」と表示する
        break;                                      // switch文を終了
}
上記の例では変数scienceにchemistryが代入されているので「case ‘chemistry’:」の処理が実行され、「私は化学が好きです。」と表示されます。

while文

while文は条件式が真の間だけ、処理を繰り返し実行するものです。
以下は”ありがとう”を100回表示するプログラムです。
<?php
$i = 0;                         // 変数iを定義して0を代入
while ($i < 100) {                   // 変数iが100未満であれば処理を実行、100より大きければ処理を実行せずループを終了
    echo "ありがとう";    // 「ありがとう」と表示する
    $i++;                           // 変数iに1を加算する
}                                  // 条件式へ戻る

for文

while文以外のもうひとつの繰り返し処理の例が、for文です。
for文は継続条件式が真の間繰り返し実行されるというものです。定義は以下の通りです。
for(初期化式; 継続条件式; 再初期化式){
    処理;
}
こう書くととても難しいように見えますが、実際的には、限られた回数だけ処理を行ないたい場合、while文より便利です。
処理の流れを見てみましょう。
1.「初期化式」を実行
2.「継続条件式」で真と判定された場合に内部の処理を実行、判定結果が偽の場合ループを終了
3.「再初期化処理」を実行
※以降2,3の繰り返しとなります。
例えばwhileの例であった、「ありがとう」を100個表示するプログラムをfor文で記述してみましょう。
<?php
                                      // 変数iを定義し0を代入 ※ループの初回のみ実行される
for ($i = 0; $i < 100; $i++) {      // 変数iが100未満だったら以下の処理を実行、変数iが100より大きければ処理を実行せずにループを終了
    echo "ありがとう";    // 「ありがとう」と表示する
}                                  // 変数iに1を加算し、継続条件式へ再び「i < 100」が真となるか判断する。

foreach文

foreachは配列など反復可能なデータ構造の中の値を一個づつ処理するのに使います。
foreach(配列 as 値){
    処理;
}
現在の配列のキーを取得したい場合は
foreach(配列 as キー => 値){
    処理;
}
となります。
例えば
<?php
$fruits = array('banana' => 'バナナ', 'orange' =>  'オレンジ', 'apple' => 'りんご', 'peach' => '桃');
という配列があって、この配列の中身を全て出力したい場合、下記のようにします。
<?php
$fruits = array('banana' => 'バナナ', 'orange' =>  'オレンジ', 'apple' => 'りんご', 'peach' => '桃');
foreach ($fruits as $fruit) {   //配列の値の数だけ繰り返します。
    echo $fruit . PHP_EOL;     //$fruitには現在いる場所の値が入っています。この場合、最初ならバナナ、次はオレンジになります。
}
出力結果
バナナ
オレンジ
りんご

関数

PHPの関数

PHPでは、関数もjavascriptと同じように使うことができます。
function 関数名(引数)
{
    処理;
    return 戻り値;
}
<?php
function hello($name)
{
    $answer = "こんにちは、{$name}さん。";
    return $answer;
}
$nameに”太郎”を渡すと
”こんにちは、太郎さん。”
が返ってきます。

無名関数

PHPでもjavascriptと同じように無名関数を使うこともできます。変数自体が関数オブジェクトとなります。使い方は、変数を代入する時と同じようなやり方です。
<?php
$a = function(){
    echo "test";
};
$a();

関数のコメント

関数には、その関数がどのような動作をするのかを説明するコメントを必ず添えるようにしましょう。
実はコメントの書き方にも決まりがあるのです。
例えば、1つの整数を引数にとり、その整数に1を加算して返すadd1という関数を実装したらコメントは次のようになります。
<?php
/**
 * 1を加算する関数
 * @param int $number 1を加算したい数値
 * @return int 加算後の数値
 */
function add1 ($number)
{
    return $number + 1;
}
1行目から見ていきましょう。1行目はコメントの始まりを示す「/**」が記述されています。
2行目には関数add1の説明を記述します。
3行目の始めには@paramと書かれていますね。このparamタグはこの関数がparameter、つまり引数を必要とすることを意味しています。
@param [データ型] [変数名] [引数の説明]という順番になっています。この場合引数は1個ですが、複数個ある場合は複数行に渡って記述します。
4行目の@returnはこのadd1関数が何らかの値を返すことを示しています。この場合は変数名は入らず、@return [データ型] [戻り値の説明]と続きます。
他にも様々なタグがありますが、よく使う@paramと@returnについてはしっかりと押さえておきましょう。
最後にはコメント行の終わりを示す「*/」を忘れずに。
タグ 意味
@access アクセス権限
@see 別要素へのリンク
@link ハイパーリンク
@todo todo, 開発予定
@var 変数
@author 作者
@example サンプルファイル
@version ヴァージョン

課題

それではPHPの課題に取り組んでみましょう!

■準備問題

1〜100までの数値を順に出力しなさい。
ただし、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、3でも5でも割り切れる場合は「FizzBuzz」、
それ以外は数値をそのまま出力する。出力はコンソール上で行うものとする。
狙い : PHPの変数の理解、for文とif文の理解

■第1問

引数が素数であれば、返り値にtrue、素数でなければ返り値にfalseを返す関数を作成しなさい。
ただし、素数とは1とその数自身でしか割れない数のことである。
また、その関数を利用し、100以下の素数を配列形式で出力するプログラムを作成しなさい。
狙い : bool型、配列型の理解。関数の理解。

■第2問

第1問を応用し、次のような配列を作成して出力させなさい。
・100以下の素数ではない数を配列のキーとする
・そのキーに対する値は、キーの素因数(1と自身を除いた割り切れる数全て)を格納した配列とする
狙い : 多次元配列の理解。

■第3問

整数を引数とし、漢数字を返り値とする関数を作りなさい。
ただし、以降漢数字は、10は十ではなく一〇とする。21は二十一ではなく二一とする。100は百でなく一〇〇とする。
狙い : PHP標準関数、文字列処理の理解。配列の適切な利用。

■第4問

2問目で作成された配列の中身を全て、3問目の関数を使って、漢数字にして出力しなさい。
狙い : 多次元配列の利用、2重ループ。
このドキュメントは Sphinx 1.2.1 で生成しました。