# PHP基礎
## データ型
データ型にはstring, integer, boolean, arrayなどがあることを紹介。
まず、stringとintegerに触れてもらう。
自分の名前(string)と年齢(integer)をターミナルに出力する課題みたいなものをやりたいです。
その時にechoについて解説。
```php=
echo "鍋島";
> 鍋島
echo 24;
> 24
```
## 四則演算子
```php=
echo 1 + 1; // 足し算(加算)
> 2
echo 10 - 3; // 引き算(減算)
> 7
echo 5 * 2; // 掛け算(乗算)
> 10
echo 8 / 4; // 割り算(除算)
> 2
echo 7 % 2; // あまり(剰余)
> 1
```
四則演算の計算順を変えたいときは()を利用する
```php=
echo 1 + 2 * 3;
> 7
echo (1 + 2) * 3;
> 9
```
## 連結演算子
文字と文字を繋げるときは連結演算子(.)を使用する
```php=
echo "Hello, " . "PHP";
> Hello, PHP
echo "7 + 3 = " . 10;
> 7 + 3 = 10
echo 8 . 5;
> 85
```
## 変数
```php=
$name = "鍋島";
echo $name;
> 鍋島
$age = 24;
echo $age;
> 24
```
## 配列
値を<span style="color: red; ">順番</span>で管理することができる。
その順番のことを<span style="color: red; ">インデックス番号</span>と呼ぶ。
配列は左から0, 1, 2...という風に0からカウントする。
配列の中に入っているものを<span style="color: red; ">要素</span>と呼ぶ。
```php=
$names = array("Mike", "Judy", "太郎");
```
配列の中から要素を1つ取り出すとき、`配列が代入されている変数[インデックス番号]`とすることでそのインデックス番号の要素を取り出すことができる。
```php=
$names = array("Mike", "Judy", "太郎");
echo $namges[1];
> Judy
```
count関数を使うと配列の要素数をカウントしてくれる。
```php=
$names = array("Mike", "Judy", "太郎");
echo count($names);
> 3
```
要素の値を上書きするにはまず上書きしたい要素を取得する必要があります。
その後、それに対して`=(代入演算子)`を用いて更新したい値を代入します。
```php=
$names = array("Mike", "Judy", "太郎");
echo echo $names[2];
> 太郎
$names[2] = "Taro";
echo $names[2];
> Taro
```
配列に要素を追加するには以下のようにします。
```php=
$names = array("Mike", "Judy", "太郎");
$names[] = "Nancy";
echo $names[3];
```
## 連想配列
配列が要素を順番で管理できるのに対し、連想配列は要素にキーを付け、キーで管理することができます。
キーで管理される値をバリューと呼びます。
```php=
$languages = array(
"japan" => "日本語",
"china" => "中国語",
"america" => "英語"
);
```
バリューを取得するには、そのバリューを管理しているキーを利用します。
```php=
$languages = array(
"japan" => "日本語",
"china" => "中国語",
"america" => "英語"
);
echo $languages["japan"];
> 日本語
```
バリューの値を更新するにはまず、更新したいバリューを取得する文法を記述します。
その後、代入演算子を用いて更新する値を代入します。
```php=
$languages = array(
"japan" => "日本語",
"china" => "中国語",
"america" => "英語"
);
$languages["japan"] = "japanese";
echo $languages["japan"];
> japanese;
```
既存の連想配列にキーとバリューのセットを追加するには以下のようにします。
```php=
$languages = array(
"japan" => "日本語",
"china" => "中国語",
"america" => "英語"
);
$languages["korea"] = "韓国語";
echo $languages["korea"];
> 韓国語
```
## 変数と連結演算子
```php=
$firstName = "大地";
$lastName = "鍋島";
echo $lastName . $firstName;
> 鍋島大地
$applePrice = 100;
$taxRate = 0.1;
$result = 100 * (1 + $taxRate);
echo "りんごは税込で".$result."円です";
```
自分の年齢を$ageに代入し、「私は〇〇歳です」と出力するようなプログラムを書いてください。
## 比較演算子
```php=
$a = 5;
$b = 8;
$c = 5;
$a < $b; // 8は5より大きいのでtrue
$a > $b; // 5は8より小さいのでfalse
$a <= $c; // 5は5以上に含まれるのでtrue
$a >= $c; // 5は5以下に含まれるのでtrue
$a == $b; // 5と8は等しくないのでfalse
$a == $c; // 5と5は等しいのでtrue
```
## 加算子/減算子
加算子と減算子は前置と後置で異なる挙動をとります。
| 例 | 名称 | 説明 |
| -------- | -------- | -------- |
| ++$a | 前置加算子 | +1した後$aを返します |
| $a++ | 後置加算子 | $aを返した後+1します|
| --$a | 前置減算子 |-1した後$aを返します|
| $a-- | 後置減算子 | $aを返した後-1します|
```php=
// 前置加算子
$a = 0;
echo ++$a;
> 1
echo $a;
> 1
```
```php=
// 後置加算子
$a = 0;
echo $a++;
> 0;
echo $a;
> 1;
```
```php=
// 前置減算子
$a = 0;
echo --$a;
> -1
echo $a;
> -1
```
```php=
// 後置減算子
$a = 0;
echo $a--;
> 0
echo $a;
> -1
```
## 制御構文
### if構文
```php=
$a = 3;
$b = 9;
if ($a < $b) {
echo $b . "は" . $a . "より大きい";
}
if ($b % 3 == 0) {
echo $b . "は3で割り切れるので3の倍数です";
}
```
条件式がfalseの時も動作するようにする
```php=
$a = 3;
$b = 9;
if ($a > $b) {
echo $b . "は" . $a . "より大きい"; // trueの時
} else {
echo $a . "は" . $b . "より小さい"; // falseの時
}
if ($b % 2 == 0) {
echo $b . "は2で割り切れるので2の倍数です"; // trueの時
} else {
echo $b . "は2で割り切れないので2の倍数ではありません"; // falseの時
}
```
2つ以上の条件式を使う
```php=
$a = 3;
$b = 9;
if ($a > $b) {
echo $b . "は" . $a . "より大きい"; // 1つ目の条件がtrueの時
} elseif ($a < $b) {
echo $b . "は" . $a . "より大きい"; // 1つ目の条件がfalseで、2つ目の条件がtrueの時
} else {
echo $a . "は" . $b . "より小さい"; // 上2つの条件がfalseの時
}
if ($b % 2 == 0) {
echo $b . "は2で割り切れるので2の倍数です"; // 1つ目の条件がtrueの時
} elseif ($b % $a == 0) {
echo $b . "は3で割り切れるので3の倍数です"; // 1つ目の条件がfalseで、2つ目の条件がtrueの時
} else {
echo $b . "は2で割り切れないので2の倍数ではありません"; // 上2つの条件がfalseの時
}
```
### switch構文
if構文では複数の条件で条件分岐をすることができ`aとbが等しい時`や`aよりbが大きい時`のような条件分岐を実装することができます。
```php=
$a = 100;
$b = 70;
if ($a == $b) {
echo $a . "と" .$b . "は等しいです";
} elseif ($a < $b) {
echo $a . "は" . $b . "より小さいです";
} else {
echo $a . "は" . $b . "より大きいです";
}
```
switch文ではある変数の中身がある値と等しい時の条件分岐を実装することができます。
```php=
$weather = "sunny";
switch ($weather) {
case "rainy":
echo "今日は雨です";
break;
case "cloudy":
echo "今日は曇りです";
break;
case "sunny":
echo "今日は晴れです";
break;
default:
echo "その他の天気です";
}
```
if構文で表すとこのようになります。
```php=
$weather = "sunny";
if ($weather == "rainy") {
echo "今日は雨です";
} elseif ($weather == "cloudy") {
echo "今日は曇りです";
} elseif ($weather == "sunny") {
echo "今日は晴れです";
} else {
echo "その他の天気です";
}
```
次のif構文をswitch構文に直しましょう。
```php=
$omikuji = "大吉";
if ($omikuji == "凶") {
echo "あなたの運勢は凶です";
} elseif ($omikuji == "小吉") {
echo "あなたの運勢は小吉です";
} elseif ($omikuji == "中吉") {
echo "あなたの運勢は中吉です";
} elseif ($omikuji == "大吉") {
echo "あなたの運勢は大吉です!"
}
```
### for
```php=
// $i < 3の条件が成り立つ限りループする
for ($i = 0; $i < 3; $i++){
echo $i . "回目のループを実行しました";
}
```
```php=
$names = array("Mike", "Judy", "Taro");
$count = count($names); // 3
// $i < $countの条件が成り立つ限りループする
for ($i = 0; $i < $count; $i++){
echo $names[$i];
}
```
```php=
$nums = [1, 2, 3, 4, 5];
// $i < count($nums)の条件が成り立つ限りループする
for ($i = 0; $i < count($nums); $i++){
if ($nums[$i] % 2 == 0) {
echo $nums[$i] . "は2の倍数です";
}
}
```
以下の変数を配列にまとめ、forを使ってその配列の要素を1つずつ出力してください。
```php=
$fruit1 = 'apple';
$fruit2 = 'orange';
$fruit3 = 'grape';
```
### while
```php=
$num = 0;
// $num <= 10の条件が成り立つ限りループする
while ($num <= 10) {
echo $num;
$num++;
}
```
```php=
$num = 10;
// $num >= 0の条件が成り立つ限りループする
while ($num >= 0) {
echo $num;
$num--;
}
```
### foreach
```php=
$furuits = ["apple", "orange", "grape"];
foreach ($fruits as $fruit) {
echo $fruit;
}
> apple
> orange
> grape
```
```php=
$names = ["Mike", "Judy", "Nanc"];
foreach ($names as $name) {
echo "My name is " . $name;
}
> Mike
> Judy
> Nancy
```
```php=
$user = array(
"名前" => "太郎",
"年齢" => 18,
"性別" => "男"
);
foreach ($user as $key => $value) {
echo $key . " : " . $value;
}
> 名前 : 太郎
> 年齢 : 18
> 性別 : 男
```
以下の連想配列のキーとバリューを使って以下の形式で出力するようにしてみましょう。
```php=
$cities = array(
"日本" => "東京",
"アメリカ" => "ワシントン",
"中国" => "北京"
);
// 形式
// 〇〇の首都は□□です
```
## 組み込み関数
```php=
$word = "Hello, World!";
// 文字列を大文字にする
echo strtoupper($word);
> HELLO, WORLD!
// 文字列を小文字にする
echo strtolower($word)
> hello, world!
// 文字列の一部を置き換える
echo str_replace("World", "PHP", $word);
> Hello, PHP!
// 文字列の文字数をカウントする
echo strlen($word);
> 13
// 配列の要素数をカウントする
echo count(['apple', 'orange', 'grape']);
> 3
// 前後の空白を取り除く
echo trim(" Hello, World! ");
> Hello, World!
// 小数第一位を四捨五入する
echo round(2.7);
> 3
// 小数第二位を四捨五入する
echo round(3.1415, 1);
> 3.1
// 小数第三位を四捨五入する
echo round(3.1415, 2);
> 3.14
```
## ユーザー定義関数
### 関数(引数なし)
```php=
function greeting() {
echo "Hello, PHP!";
}
greeting();
> Hello, PHP!
```
```php=
function add(){
echo 5 + 8;
}
add();
> 13
function devide(){
echo 10 / 2;
}
devide();
> 5;
```
自分の名前を出力する`introduce`メソッドを作りましょう。
introduceメソッドを実行すると`私の名前は〇〇です`と出力するようにしてください。
また、〇〇には自分の名前を入れましょう。
### 関数(引数あり)
```php=
function greeting($name) {
echo "Hello, " . name;
}
greeting("Mike");
> Hello, Mike
greeting("Bob");
> Hello, Bob
$name = "Judy";
greeting($name);
> Hello, Judy
```
```php=
function add($x, $y) {
echo x + y;
}
add(3, 4);
> 7
add(1, 9);
> 10
$x = 6;
$y = 5;
add($x, $y);
> 11
```
引数を1つとる`introduce`メソッドを定義してください。
introduceメソッドを実行すると`私の名前は〇〇です`と出力するようにしてください。
〇〇の部分は引数に応じて出力結果が異なるようにしてください。
### 関数(戻り値)
```php=
function getRectangleArea($x, $y) {
return x * y;
}
$area = getRectangleArea(3, 9);
echo "面積は" . $area. "㎠です";
> 面積は27㎠です
```
```php=
function getTaxIncludedPrice($price){
$rate = 0.1
return $price * (1 + $rate);
}
$apple = 100;
$result = getTaxIncludedPrice($apple);
echo "りんごは税込で" . $result . "円です";
> りんごは税込で110円です
```
```php=
$weight = 60;
$height = 1.74;
function getBMI($weight, $height) {
return round($weight / ($height * $height), 1);
}
$bmi = getBMI($weight, $height);
echo "あなたのBMIは" . $bmi . "です";
> あなたのBMIは19.8です
```
## class(インスタンスメソッドの呼び出し)
```php=
class Dog{
public function bark(){
echo "baw waw";
}
}
$dog = new Dog();
$dog->bark();
> baw waw
```
```php=
class Person{
public function greeting(){
echo "Hello!";
}
}
$person = new Person();
$person->greeting();
```
## class(コンストラクタ)
```php=
class Sample{
public function __construct(){
echo "インスタンス化されました";
}
}
new Sample();
> インスタンス化されました
```
```php=
class Animal{
public function __construct($cry){
echo $cry;
}
}
new Animal("baw waw");
> baw waw
new Animal("meow");
> meow
```
```php=
class Person{
protected $name;
protected $age;
public function __construct($name, $age){
$this->name = $name;
$this->age = $age;
}
public function info(){
echo "私の名前は{$this->name}です\n";
echo "{$this->age}歳です";
}
}
$person1 = new Person("太郎", 15);
$person1->info();
> 私の名前は太郎です
15歳です
$person2 = new Person("花子", 16);
$person2->info();
> 私の名前は花子です
16際です
```