PHP

【PHP復習】基本構文の確認

基本のおさらい

最近はSQLを中心に勉強しているが、新しい知識が増えた分、過去に身につけた知識を忘れてしまっている気がする今日この頃。PHP、Ruby、JavaScript等々・・・。

そのため、過去に学んだことを大まかにでも思い出せるように、備忘録として残すことにする。今回はPHP。

扱う内容は、過去にJavaScriptについて書いた記事と同じだ。
【JavaScript】1日で基本を学ぶ〜前編

PHPのバージョン

PHP(7.1.17)

基本事項

対話シェル

php -a対話シェルを起動できる。PHPのコードをその場で実行できるので便利だ。終了するときはexitを入力する。

$ php -a
Interactive shell

php > echo 1+1;
2

公式サイトはこちらから。
PHP公式サイト:対話シェル

echoとprintの違い

同じように使用されがちだが、違いがあるようだ。

詳しい内容はこちらの記事がわかりやすかった。
PHP の echo と print のちがいと使いどころ

echo

  • 文であり、値を返さない。
  • 複数の文字列を出力できる。(例:echo "aaa","bbb";)

print

  • 式であり、値を返す。(常に1(=TRUE)を返す。)よって、if文などの条件式に組み込むことができる。
  • 複数の文字列を出力できない。

変数

PHPの場合、変数の宣言をする必要がない。始めから値を代入して使用できる。

あと、最初に$を付けること!

php > $test = "aaaaa";

php > echo $test;
aaaaa

php > $test = "bbbbb";

php > echo $test;
bbbbb

文字列の結合

数字と文字をつなぐと、全て文字列(string型)の扱いとなる。変数同士の結合も可能だ。

var_dump()は、引数に指定した変数や配列の構造に関する情報を提供してくれる関数だ。重宝している。

php > echo "ようこそ"."PHPの世界へ!";
ようこそPHPの世界へ

php > $test = "aaaaa";

php > $test_2 = $test."12345";

php > echo $test_2;
aaaaa12345

php > var_dump($test_2);
string(10) "aaaaa12345"

改行(特殊文字)

\nで改行できる。

php > echo "ようこそ\nPHPの世界へ!";
ようこそ
PHPの世界へ

配列

配列も変数と同様に定義できる。公式サイトではarrayを表記した構文が紹介されているが、どちらが良いのだろうか・・・。以下の記述は短縮構文と呼ばれている書き方だ。

配列の要素数の取得は、count関数で行っている。

php > $country = ["日本", "アメリカ", "中国"];

php > echo $country[0];
日本

php > echo $country[1];
アメリカ

php > echo $country[2];
中国

php > echo count($country);
3

php > var_dump($country);
array(3) {
  [0]=>
  string(6) "日本"
  [1]=>
  string(12) "アメリカ"
  [2]=>
  string(6) "中国"
}

制御文

一つのプログラム言語を経験していれば、書き方が異なるだけでさほど大きな違いはない。構文そのものというより、処理の流れを理解する方が重要だと思う。他言語でも十分応用が効く。

以下のコードは、code_gameディレクトリに作成したtest.phpファイルに記述している。Macを使用している場合は、ターミナルで該当ファイルが保存されているディレクトリまで移動し、php ファイル名を実行すれば各コードのテストが可能だ。

公式サイトはこちらから。
PHP公式サイト:制御構造

if文

fgets(STDIN)により標準入力の内容を受け取り、trim関数で空白があればそれを削除する。

その後、型キャストにより、入力値を数値に変換している。

test.php
<?php
echo "現在の所持金はどのくらい?\n";
$money = trim(fgets(STDIN));
$money = (int) $money;

if ($money >= 10000) {
    echo "次の給料日までしのげるぞ!\n";
} elseif ($money < 10000 && $money >= 5000) {
    echo "節約しよう!\n";
} elseif ($money < 5000 && $money >= 3000) {
    echo "ちょっとやばい?\n";
} else {
    echo "毎日もやし・・・\n";
}

三項演算子

if文の条件や結果となる値が簡単なものであれば、三項演算子で記述することもできる。

通常のif文の方が見やすい気がする・・・。

test.php
<?php
echo "現在の所持金はどのくらい?\n";
$money = trim(fgets(STDIN));
$money = (int) $money;

echo ($money >= 10000) ? "次の給料日までしのげるぞ!\n" : "毎日もやし・・・\n";

switch文

test.php
<?php
echo "今の気分は?\n\n1:最高\n2:普通\n3:最悪\n";
$heart = trim(fgets(STDIN));
$heart = (int)$heart;

switch ($heart) {
    case 1:
        echo "よかったね!\n";
        break;
    case 2:
        echo "こんなもんだよね!\n";
        break;
    case 3:
        echo "早く寝て忘れましょ!\n";
        break;
    default:
        echo "1から3までの数字を入力してね!\n";
}

for文

test.php
<?php
for ($i = 1; $i <=10; $i++) {
    echo $i."回目の繰り返しです!\n";
}

while文

無限ループに陥らないように、必ず終了条件を記述すること!

test.php
<?php
$number = 1;
while ($number <= 10) {
    if ($number % 2 == 0) {
        echo $number."は偶数です\n";
    } else {
        echo $number."は奇数です\n";
    }
    $number ++;
}

条件が偽でも最低1回は処理を行いたい場合

上記のwhile文では、条件が偽の場合は一度も処理が実行されない。最低1回は処理を行いたい場合は、do...while文で処理を先に記述する。

test.php
<?php
$number = 1;
do {
    echo $number."\n";
} while ($number > 10);

break文

下記のbreak文では、numberが2になった時点でwhile文の処理が終了する。

test.php
<?php
$number = 1;
while ($number <= 10) {
    if ($number % 2 == 0) {
        break;
    } else {
        echo $number."は奇数です\n";
    }
    $number ++;
}

continue文

上記のbreak文とnumber ++;の位置が異なる。無限ループの罠にハマらないように注意。

test.php
<?php
$number = 0;
while ($number <= 10) {
    $number ++;
    if ($number % 2 == 0) {
        continue;
    } else {
        echo $number."は奇数です\n";
    }
}

関数

前回のJavaScriptと同じく、月収を入力し、そこから年収を計算するプログラムを書いてみた。

JavaScriptと比較して、グローバル変数・ローカル変数・引数の扱いで少し戸惑った。以下に2種類の記述法を掲載したので、参考になれば。

引数を取る場合

各関数をcalIncome関数でくくり、1回の呼び出しで処理を終了させる。ここでは、ネスト(入れ子)している関数全てに標準入力で得た$monthly_incomeを引数として指定している。

global宣言$monthly_incomeを使用できないか試してみたが、calIncome関数内で取得した変数は、ネストされている関数内で使用することができなかった。

test.php
<?php
calIncome();

function calIncome()
{
    echo "現在の月収はいくら?\n";
    $monthly_income = trim(fgets(STDIN));
    $monthly_income = (int)$monthly_income;

    function annualIncome($monthly_income)
    {
        $annual_income = $monthly_income * 12;
        return $annual_income;
    }

    function bonus($monthly_income)
    {
        $bonus = $monthly_income * 1.5 * 2;
        return $bonus;
    }

    function totalIncome($monthly_income)
    {
        $total_income = annualIncome($monthly_income) + bonus($monthly_income);
        return $total_income;
    }

    echo "あなたの年収は".totalIncome($monthly_income)."円です!\n";
}

グローバル変数を使用する場合

calIncome関数の外側で、標準入力により$monthly_incomeを取得している。

この場合、ネストしている関数内でglobal宣言をすることにより、$monthly_incomeが使用可能となる。

test.php
<?php
echo "現在の月収はいくら?\n";
$monthly_income = trim(fgets(STDIN));
$monthly_income = (int)$monthly_income;

calIncome();

function calIncome()
{
    function annualIncome()
    {
        global $monthly_income;
        $annual_income = $monthly_income * 12;
        return $annual_income;
    }

    function bonus()
    {
        global $monthly_income;
        $bonus = $monthly_income * 1.5 * 2;
        return $bonus;
    }

    function totalIncome()
    {
        $total_income = annualIncome() + bonus();
        return $total_income;
    }

    echo "あなたの年収は".totalIncome()."円です!\n";
}

どちらの方法が良いのだろうか?調べた限りではグローバル変数の使用はあまり奨励されていなかったので、前者の方法が無難かもしれない。

おわりに

関数の構造がJavaScriptとかなり異なっていた。しかし、それ以外の構文についてはそれほど違いを感じなかった。

今度はRubyで同様の記事を書きたい。たま〜に別の分野を勉強するのは、息抜きや刺激にもなる。今までとは違う視点も持てるかも?

今回はここまで。