☆☆ 新着記事 ☆☆

2018年6月29日金曜日

PHP 基礎




// ・・・これを書いた行の行末までがコメント扱いとなります。

例1. $abc = 'あいうえお';//コメントです。
例2.//コメントです。
この場合、「コメントです。」部分がコメント化(無効化)されます。

# ・・・これを書いた行の行末までがコメント扱いとなります。

上記の「//」と同じです。

/*~*/ ・・・複数行にわたってコメント化できます。

CSSのコメント方法と同じです。
例1.
/*
コメントです。
コメントです。
*/
複数行に渡る場合に主に使います。

条件分岐について

具体的には、以下のような書式で条件分岐を行います。
  
if (条件1) {
  条件1に一致した場合に実行する(TRUEの場合の処理) 
} elseif (条件2) {
  条件1に一致せず、条件2に一致した場合に実行する
} else {
  条件1と条件2の両方に一致しなかった場合に実行する(FALSEの場合の処理)
}
 

PHPは終了タグ?>を見つけると、それ以降に新たに開始タグ<?を見つけるまでの内容を出力するため、以下の例のように記述する事も可能です。
<? if($f=="morning"){ ?>
おはようございます
<? }elseif ($f=="noon"){ ?>
こんにちは
<? }else{ ?>
こんばんは
<? ?>





その他swich分などもありますが、やりたいこと、やることは同じです。
まずは特に覚える必要は無いでしょう。自分もほぼ使ってません。
逆に条件分岐はこのif分だけですべて片付きます。必要に応じてswichなども検討すればOKです。

変数

どのプログラミング言語でもこの「変数」は存在しますので、名前ぐらいは聞いたことがあるかもしれません。
よく物を入れる箱のようなものと言われますが、まさにそんな感じです。ここの「物」は実際には文字列や数値などです。
変数は必ず$マークから始まります。
例 $hensuu
変数名に日本語は使えません。半角英数字、アンダーバー「_」が使えます。
<?php
$hensuu = '変数です';
?>

「=」は代入を表します。この場合、変数$hensuuに文字列「変数です」を代入させています。
文字列(全角文字)は必ずシングルクォーテーション、またはダブルクオーテーションで囲む必要があります。
また、処理の最後尾には必ずセミコロン「;」が必要です。
これだけではなにも起こりません。変数に代入しただけだからです。

ブラウザに出力(表示)する

これを出力させるには
echo、またはprintを使います。
例 
<?php
echo $hensuu;
?>

でブラウザには「変数です」と表示されます。
echo、printはどちらでも構いませんが、PHPではechoが多数派と言われます。
厳密には若干違いもありますが、意識することはないでしょう。
またショートコードでechoを省略した
<?= $hensuu;?>
と書くこともできますが、前述のとおり使うべきではありません。たまに使う人がいるので知ってはおきましょう。
そういう方には「かっこいいすね!」と言ってあげましょう。
日本語などの文字列を出力する場合は、シングルクォーテーション「'」、またはダブルクオーテーション「"」で囲む必要があります。
echo ’変数です’;
また、HTMLタグを出力する際にも同じくシングルクォーテーション、またはダブルクオーテーションで囲む必要があります。
シングルクォーテーション、ダブルクオーテーションにはそれぞれ違いありますので、注意が必要です。し、とても大事なことなので、覚えておきましょう。
シングルクォーテーション = 変数は展開(変数に代入されたものが表示)されない
ダブルクオーテーション = 変数は展開(変数に代入されたものが表示)される
echo $hensuu;

echo "$hensuu";
は同じで「変数です」と表示されますが、
echo '$hensuu';
とすると変数が展開されないため、「$hensuu」と表示されます。
問題になりやすいのがHTMLを出力する際です。なぜならHTMLの属性にダブルクオーテーションが使われるからです。
echo "<p class="text">{$hensuu}<p>";
※変数をダブルクオーテーションで囲む場合には変数を{}で囲みます。囲まなくても問題無いことが多いですが、どこまでが変数名なのかを明示的に示すことで無用なエラーなどが起きませんので囲んでおきましょう。
この場合、一見問題無さそうですが、エラーとなり、画面にはエラーしか表示されません
ダブルクオーテーションの中にダブルクオーテーションがあるためPHPが解釈できずにエラーとなります。
ではシングルクォーテーションではどうでしょうか。
echo '<p class="text">$hensuu<p>';
一見これで良さそうですが、シングルクォーテーション内では変数が展開されないため期待通りの表示がされません。
ではどうするか。いくつか方法があります。
・ダブルクオーテーション内のダブルクオーテーションにエスケープ文字「¥」マークを付ける。
echo "<p class=\"text\">{$hensuu}<p>";
これで問題なく表示されます。ただ、コードの可読性、メンテナンス性などを考慮すると必ずしもこれが正解とは言えないかもしれません。なぜなら間違って「¥」マークを消してしまうとエラーになってしまい何も表示されません。
・シングルクォーテーションと文字列の結合「.」を複数使い、変数をシングルクォーテーションで囲まないようにする。
echo '<p class="text">'.$hensuu.'<p>';
これも問題なく表示されます。ただこれも正直可読性が良いとは言えません。長めのHTMLで変数も複数になるとさらに読みにくくなります。
・HTMLの属性の値をシングルクォーテーションで囲んでしまう。
echo "<p class='text'>{$hensuu}<p>";
これも問題ありません。ただ、シングルクォーテーションで囲むことが今後のHTMLでも使用可能かどうかわかりません。まぁたぶん大丈夫と思いますが。しかし、一般的にはダブルクオーテーションで囲むことがほとんどなので、これもあまり良い方法とは言えないかもしれませんね。
・ヒアドキュメントを使う(変数は必ず{}で囲む必要があります)
(ちょっと一見特殊な書き方です。HTML~HTML;までの間に記述します。HTMLの書き方そのままのルールで記述でき、かつ変数も展開するので一見これが最強?と感じます。)
echo <<<HTML
<p class="text">{$hensuu}<p>
HTML;

これで問題なく表示されます。ただ、上下に記述が増えてしまいます。このHTML部はアルファベットであれば何でもOKです。が、EOFやEOL、HTMLなどが使われることが多いです。また、HTML;の前には空白スペースがあっては行けません。なので、インデントができません。
・変数の箇所のみPHPタグで囲み出力する(多数派と思われ)
<p class="text"><?php echo $hensuu;?><p>
これも問題なく表示されます。ただ、変数箇所が多いとその分記述が増えるのが難点でもあります。が、この書き方がおそらく一番多いと思われます。
う~ん、で?結局どれを使えばいいねんw。となるのですが、正直自分にもどれが最適なのか分かりません(笑)
いろいろな人のコードを見て来ましたが、書く人によって異なるというのが現状かと思います。
会社によってはコーディング規約などで決まってることもあるでしょう。
ただ、最後のものが多いかなと思います。
自分の場合、ちょっとした出力(タグ1つとか)であれば
最後の変数箇所のみphpタグで囲む。
記述が長い場合には「ヒアドキュメントを使う」にすることが多いです。
どれを使うにしろ書き方は統一するのが良いでしょう。
その他PHPでインデントのためにタブスペースや半角スペースを多く使いますが、全角文字(スペース含む)は絶対に書いてはいけません。PHPエラーになります。
特に全角スペースは一見気づきにくいので注意が必要です。エラーが治らない・・・と思ったら全角スペースが入っていたなんて初めのころはよくやります。 スペースは必ず半角スペース(またはタブ)です。
コードの可読性のためにもインデントは入れることをおすすめします。
自分はHTMLの場合はあえてインデントさせず左寄せにしていますが、プログラムを書く場合はインデントを入れてます。入れ子が複雑になると分けわからなくなることもあります。
ちなみにDWには「カッコ内を選択する」という便利な機能が付いてます。この(から)はどのif文のものかなどが一発で分かります。

賛否あるかと思いますが、個人的にHTMLには別に必要無いと考えています。制作会社である以上プロなんだから見りゃわかるでしょ的な。また、インデント方法を統一するのも難しいなどがあります。DWの「ソースフォーマットの適用」で一発で入れることもできますが。

配列

一つの変数に複数の値を持たせたい場合に使います。これもよく使います。
$hensuu[0] = '変数1です';
$hensuu[1] = '変数2です';

変数名の後に添字(キー)を記述します。
この場合、
echo $hensuu[1];
とした場合、「変数2です」が表示されます。
またこの添字(キー)は省力出来ます。(というか省力することがほとんどですが)
その場合、0からの連番で自動付与されます。
$hensuu[] = '変数1です';
$hensuu[] = '変数2です';

とした場合、
echo $hensuu[1];
で同じく「変数2です」が表示されます。
ただ、この指定方法だと多くなった場合には記述が増え面倒です。
$hensuu[]= '変数1です';
$hensuu[] = '変数2です';
$hensuu[] = '変数3です';

・・・
そこでarray関数というのを使います。
$hensuu = array('変数1です','変数2です','変数3です');
左から順番に添字(キー)が付与されますので、これで
echo $hensuu[1];
で同じく「変数2です」が表示されます。
なぜ配列をわざわざ使うのか。
これは配列で書いたほうがコードを少なくできるからに尽きるでしょう。
たとえばフォームなどでよく都道府県のプルダウンを使うことはあるでしょう。
ここではすべて書くと大変なので、東北6県だけにします。
変数も何もPHP自体使わない場合
<select name="都道府県">
< option value="青森県">青森県</option>
< option value="岩手県">岩手県</option>
< option value="秋田県">秋田県</option>
< option value="宮城県">宮城県</option>
< option value="山形県">山形県</option>
< option value="福島県">福島県</option>
< /select>

まぁこうなります。当然47都道府県あればその分必要になります。
変数を使い配列を使わない場合。
<?php
//配列に県名を入れる
$aomori = '青森県';
$iwate = '岩手県';
$akita = '秋田県';
$miyagi = '宮城県';
$yamagata = '山形県';
$hukusima = '福島県';
?>
< select name="都道府県">
< option value="<php echo $aomori;?>"><php echo $aomori;?></option>
< option value="<php echo $iwate;?>"><php echo $iwate;?></option>
< option value="<php echo $akita;?>"><php echo $akita;?></option>
< option value="<php echo $miyagi;?>"><php echo $miyagi;?></option>
< option value="<php echo $yamagata ;?>"><php echo $yamagata;?></option>
< option value="<php echo $hukusima;?>"><php echo $hukusima;?></option>
< /select>

なんか気づきませんか?PHP自体使わない場合と記述量は一緒ですね・・・。
いや、変数を定義している分増えてしまっています。当然47都道府県あればその分増えることになります。
もちろん万が一「青森県」が県名が変わって「緑森県」になった場合、直す箇所は一箇所で済みますので、
やらないよりはましかもしれませんが・・・。

配列を使った場合
<select name="都道府県">
<?php
//配列に県名を入れる
$kenmei = array('青森県','岩手県','秋田県','宮城県','山形県','福島県');
//配列の数だけループする
foreach($kenmei as $val) {
//出力する(「”」内にタグの属性「”」を書く場合はその前にエスケープ処理「¥」マークが必要です)
echo "<option value=\"{$val}\">{$val}</option>";
}
?>
< /select>

たったこれだけで済みます。コメントを書いているので多く見えますが、4行で済みます。
foreachはループ処理です。配列の数だけ自動で添字(キー)0から順番にループしますので、配列ループ時にはよく使います。asの後の$valに配列の各要素が順番に代入されますので、青森県、岩手県・・・と表示されます。
同じくループ処理に使われるfor文があります。こちらは聞いたことがあるかもしれません。
これでも書くことができますが、配列のループの場合はforeachのほうが手っ取り早いです。
for文で書く場合
<select name="都道府県">
<?php
//配列に県名を入れる
$kenmei = array('青森県','岩手県','秋田県','宮城県','山形県','福島県');
for($i=0;$i<count($kenmei);$i++) {
//出力する(「”」内にタグの属性「”」を書く場合はその前にエスケープ処理「¥」マークが必要です)
echo "<option value=\"{$kenmei[$i]}\">{$kenmei[$i]}</option>";
}
?>
< /select>


countは文字通りカウントする関数です。この場合、変数の数を数えています。
配列の詳細については以下マニュアル等を参考下さい。
http://php.net/manual/ja/language.types.array.php

定数

定数とは、変数と似ていますが、変数は上書きできるが、定数は一度定義したらその値は変わらないという特徴があります。PHPでは、定数を定義するために、define()関数を使い、定数名とその値を引数とします。以下が定数を定義するための公式です。
define("定数名", "値");
例 define("hensuu", "変数だよ");

変数の場合、
$hensuu = '変数だよ';
$hensuu = '変だよ';
とした場合、後に読み込まれる「変だよ」が代入されますが、
定数の場合はこれができません(しても無効です)。これが大きな違いです。
ただ、とりあえず定数は使わずともOKです。
なぜならすべて変数で指定してまえるからです。
また、配布中のプログラムでも定数は一度も使ってません。すべて変数にしていますが、
設定箇所の変数の値は変化しませんので、定数で定義してもいいでしょう。
実務では定数を使うことがありますが、個人的にはコードの可読性なども含め、必須とは考えてません。
変数は先頭にドルマーク「$」がつきますが、定数の場合付きませんので、一見すると関数と区別しづらいという点があります。
ただ、他の人のコードなどを見る際などのために、または今後のためにもこういうのがあるということは知っておく必要があります。

関数

PHPは関数で作ると言ってもいいでしょう。実際には主に関数、変数、条件分岐からなります。
関数名(引数);
の形で記述します。
例 メールを送信するための関数(mail関数)
mail($to,$subject,$body,$header);
PHPは、あらかじめ1000以上にも及ぶ「関数」が定義されています。これを使ってプログラムを組んでいくことになります。ただ、実際すべて覚える必要は無く、実際によく使う関数は限られています。
たとえば文字の置換用の関数:str_replace('変換前の文字列','変換後の文字列','変換元の文字列');
使用例
$honbun = 'テストです';
$hensuu = str_replace('テスト','本番',$honbun);

//文字列はシングルクォーテーション(またはダブルクオーテーション)で必ず囲みます
echo $hensuu;

とした場合、「本番です」と表示されます。
この「引数」の順番、数は決まっていますので、ちゃんと決まりに沿って記述する必要があります。
この場合、「php str_replace」で検索すればマニュアルページがありますのでそちらで確認して下さい。

PHPにあらかじめ組み込まれている関数については、以下のサイトなんかが参考になります。
http://www.scollabo.com/banban/php/reference.html
また、「PHP逆引きレシピ」という本がすごく良いです。必携の書と言っても良いかもしれません。

演算子

計算を行うための記述です。
演算子意味例示機能
+加算12 + 52つ以上の値の足し算を行う
-減算12 - 52つ以上の値の引き算を行う
*乗算12 * 52つ以上の値の掛け算を行う
/乗算12 / 52つ以上の値の割り算を行う
%剰余12 % 5割り算したときの割り切れなかった数を求める

比較演算子

これもとにかく必須です。必ず使います。
if($tounyu_kingaku >= $juice_nedan)
でジュースの値段と投入金額を比較しています。
この場合、投入金額がジュースの値段以上であれば~という条件分岐です。
比較演算子
名前結果
$a == $b等しい型の相互変換をした後で $a が $b に等しい時に TRUE
$a === $b等しい$a が $b に等しく、および同じ型である場合に TRUE
$a != $b等しくない型の相互変換をした後で $a が $b に等しくない場合に TRUE
$a <> $b等しくない型の相互変換をした後で $a が $b に等しくない場合に TRUE
$a !== $b等しくない$a が $b と等しくないか、同じ型でない場合に TRUE
$a < $bより少ない$a が $b より少ない時に TRUE
$a > $bより多い$a が $b より多い時に TRUE
$a <= $bより少ないか等しい$a が $b より少ないか等しい時に TRUE
$a >= $bより多いか等しい$a が $b より多いか等しい時に TRUE

 

0 件のコメント:

コメントを投稿