おはようございます!そうすけです!
運営者:そうすけ
愛媛出身の30代のブロガー兼ソフトウェアエンジニア。
フロントエンド・API開発を行っています。
ITエンジニアとしての暮らしやキャリアなどの発信をしています。
趣味はガジェットと植物。
今回は有名言語phpを勉強してみました。
なぜphp?
新しくjoinする会社が、phpベースのYiiというフレームワークを使用しているからです。
フロントエンドエンジニアとして入ったのですが、バックエンドも読めないと結局実装できません。
Yiiを触る前に、まずphpの書き方についてある程度知っておいた方がスムーズな理解ができると考えたからです。
Yiiも古くなっているのでリプレイスするそうですが、まず読めないことにはリプレイスに参加させていただくこともできません。
なので、phpの基礎的な部分について学びました。
使用した書籍
1週間でPHPの基礎が学べる本
kindle unlimitedで無料だったし、導入としては超かみ砕いたものの方が頭はいりやすいので、この本にしました。
言語は違えど、ある程度考え方は似ているので、初めのさわりだけ理解して、後は業務で実践していこうというノリで勉強しました。
phpの仕様
言語について
- 動的型付け言語
- phpは変換しながら読むインタープリタ言語(Java、Rubyはコンパイラ言語)
特徴
- Javaのようにアンドロイドなどには使用できないがWEBアプリに特化している
- セキュリティ面でぜい弱だが、larabelなどのフレームワークがでてきており、強化されている。
- php7はphp5の2倍のパフォーマンスがある。8はそれ以上。
環境構築
MAMPを使用して学んでいきます。
VSCODEの設定
PHP Intelephenseを拡張機能として導入します。
デフォルトのVScodeの@builtin phpを無効化します。
「PHP 言語機能」を無効にする。「PHP の基本言語サポート」は有効のままでOK。
下記参考にしました
MAMP
インストールをここから行います。
インストールできたら、MANPを立ち上げます。
stop serverでローカルサーバー起動。
open webstrat pageを押すとhttp://localhost/MAMP/へブラウザトップが立ち上がります。
tools→phpinfoをして、設定ファイルでブラウザ上にエラーが表示されるようにして行きます。
tools→phpinfoを押して遷移し、phpのバージョンを確認します。
該当のバージョンのphp8.3.1のdisplay_errorsをonにする
わざとエラーを起こして確認します。
htdocs\section\sample2-1.phpを作成し、http://localhost/section/sample2-1.phpにアクセスしてみます。
今回は「echo」を「rcho」と書いてエラーを吐き出させます。
エラーが無事表示されました。これで準備完了!
基礎
基本的にスカラー型という4つのデータ型があります。
名前 | 例 |
---|---|
bool | true,false |
int | -1,100,0 |
float | 3.5,-53.5 |
string | “php”,”そうすけ” |
phpファイルでHTMLを表現する方法
文字列として表現する
<?php
echo "hello worldaaa <br>" ;
echo "<div>hohohohohoho</div>";
echo 1*6;
?>
htmlで表現する
htmlの記述にphpのスクリプトを埋め込む
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>php practice</title>
</head>
<body>
<h1>php practice book</h1>
<div><?php echo "sousuke blog"; ?></div>
</body>
</html>
divタグの中に<?php~?>を埋め込み、この箇所にphpのスクリプトを埋め込む
出力した結果は文字列となる
ヒアドキュメント
ヒアドキュメントとは複数行にわたる文字列を人るのecho分で表示するための方法
記述方法
<<<(ID)
複数行にまたがる文字列
(ID)
例
<!-- ヒアドキュメント -->
<?php
echo <<<DATA
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>php practice</title>
</head>
<body>
<h1>php practice book</h1>
<div>ヒアドキュメント</div>
</body>
</html>
DATA;
?>
変数
「$」で変数宣言になる
「.」で文字列演算子で文字連結の時に使用する
<?php
$a = 10;
$b = 2;
$c = $a + $b;
echo $a . "+" . $b . "=" . $c;
?>
変数の展開は{$変数名}
strvalで文字列に変換
<?php
$hensu = 3;
echo "変数の値:{$hensu}<br>";
$hensu = $hensu + 4;
echo "変数の値:{$hensu}<br>";
$hensu = strval($hensu) . "そうすけ";
echo "変数の値:{$hensu}<br>";
?>
””で囲んでも表示されるが、極力{}で
var_dump関数でデータ型と値を知ることができる
unsetで変数自体を消去する
<?php
$variable = 0.25;
var_dump($variable);
echo "<br>";
$variable = "php";
var_dump($variable);
echo "<br>";
$variable = true;
var_dump($variable);
unset($variable);
var_dump($variable);
?>
※文字列が3と表示されているのは文字数でなくバイト数。utf8は一文字1バイト。
全角日本度など、必ず文字数とバイト数が一致するわけではないので注意。
echoはシングルコーテーションでエスケープシーケンスを書かなくてよくなる
$a = "sousuke";
echo "$a" #sousukeと表示
echo '$a' #$aと表示
条件分岐
基本的にJavaと同じ。
<?php
$temp = random_int(-200,200);
echo $temp;
echo "<br>";
if($temp > 0 && $temp < 100){
echo "0^100";
}
elseif ($temp >= 100) {
echo "100>";
}
else{
echo "0<";
}
?>
配列
print_rで中身を確認できる
array_●●という関数で基本的な配列操作を行うことができる。このほかにもたくさんある。
<?php
#配列の確認
$array_bikaku = ["hilli","corona","wandae"];
print_r($array_bikaku);
echo "<br>";
#前から削除
array_shift($array_bikaku);
print_r($array_bikaku);
echo "<br>";
#前に挿入
array_unshift($array_bikaku,"biful");
print_r($array_bikaku);
echo "<br>";
#指定インデックスを削除
unset($array_bikaku[2]);
print_r($array_bikaku);
echo "<br>";
#配列をマージ
$array_bikaku2 = ["grande","mada","ridly"];
$array_bikaku = array_merge($array_bikaku,$array_bikaku2);
print_r($array_bikaku);
#配列を切り取り
$array_bikaku = array_slice($array_bikaku,3,4);
echo "<br>";
print_r($array_bikaku);
?>
連想配列
キーが自由な配列。Jsonやレイルズのハッシュと同じ
アローで記述する
削除と追加も普通の配列とほぼ同じ
foreachが(連想配列 as 変数)となっており、javascriptと逆で苦しい
<?php
$array_ren = ["biful" => "ビフルカツム","ridley" => "リドレイ","wandae" => "ワンダエ"];
print_r($array_ren);
echo "<br>" . $array_ren["biful"];
#内容変更
$array_ren["biful"] = "コウモリラン";
echo "<br>" . $array_ren["biful"];
#追加
$array_ren["grande"] = "グランデ";
echo "<br>";
print_r($array_ren);
#削除
unset($array_ren["ridley"]);
echo "<br>";
print_r($array_ren);
echo "<br>";
#foreach
foreach($array_ren as $value){
echo "<br>" . $value;
}
#foreach(キーバリュー)
echo "<br>";
foreach($array_ren as $key => $value){
echo "<br>" . $key . ":" . $value;
}
?>
関数
Javaと記法はほぼ同じだが、型がないのが大きな違い
function avg($a,$b){
return ($a + $b) / 2;
}
echo avg(5,3);
HTTP
formタグでAction属性に遷移先、method属性にメソッドを記載
$_GETや$_postという連想配列にパラメータが飛ぶ、それをphpで表示させる
getでフォームを作る
url上にnameタグで指定した名前のパラメータが
?キー=値&キー=値
として記載される
**<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>form</h1>
<form action="sample5_3.php" method="get">
<p><b>名前</b></p>
<input type="text" value="" name="name" placeholder="例:真鍋颯一朗">
<p><b>性別</b></p>
<p>
<input type="radio" name="sex" value="男" checked="checked">男
<input type="radio" name="sex" value="女">女
</p>
<input type="submit" value="送信">
</form>
<input type="range">
</body>
</html>**
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>入力された名前</h1>
<table>
<tr>
<th>名前</th>
<th>性別</th>
</tr>
<tr>
<td><?php echo $_GET["name"] ?></td>
<td><?php echo $_GET["sex"] ?></td>
</tr>
</table>
<a href="sample5_3.html">フォームに戻る</a>
<div><?php echo var_dump($_GET) ?></div>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>入力された名前</h1>
<table>
<tr>
<th>名前</th>
<th>性別</th>
</tr>
<tr>
<td><?php echo $_GET["name"] ?></td>
<td><?php echo $_GET["sex"] ?></td>
</tr>
</table>
<a href="sample5_3.html">フォームに戻る</a>
<div><?php echo var_dump($_GET) ?></div>
</body>
</html>
postでフォームをつくる
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>form post</h1>
<form action="sample5_4.php" method="post">
<p><b>名前</b></p>
<input type="text" value="" name="name" placeholder="例:真鍋颯一朗">
<p><b>性別</b></p>
<p>
<input type="radio" name="sex" value="男" checked="checked">男
<input type="radio" name="sex" value="女">女
</p>
<input type="submit" value="送信">
</form>
<input type="range">
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>入力された名前 post</h1>
<table>
<tr>
<th>名前</th>
<th>性別</th>
</tr>
<tr>
<td><?php echo $_POST["name"] ?></td>
<td><?php echo $_POST["sex"] ?></td>
</tr>
</table>
<a href="sample5_4.html">フォームに戻る</a>
<div><?php echo var_dump($_POST) ?></div>
</body>
</html>
正規表現
例:郵便番号の正規表現は**[“/^[0-9]{3}-[0-9]{4}$/”,”/^[0-9]{7}$/”]**
正規表現のパターンは、/で囲む。
郵便番号を確認するフォーム
issetで値がnullかどうかを確認している。
入力された文言を正規表現で確認し、preg_match関数で確認している
**<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>郵便番号の確認</title>
</head>
<body>
<h1>郵便番号の確認</h1>
<p><b>郵便番号</b></p>
<form action="sample5_6.php" method="post">
<input type="text" name="where" placeholder="123-4566">
<input type="submit" value="check">
<br>
<?php
$pattern = ["/^[0-9]{3}-[0-9]{4}$/","/^[0-9]{7}$/"];
if(isset($_POST["where"])){
$postnum = $_POST["where"];
if(preg_match($pattern[0],$postnum ) === 1 or preg_match($pattern[1],$postnum ) === 1){
echo "郵便番号です";
}
elseif($postnum === ""){
echo "空白です";
}
else{
echo "郵便番号ではありません";
}
}
?>
</form>
</body>
</html>**
オブジェクト指向
クラス
記法
ー>でプロパティにアクセスする(プロパティ使用には$いらない)
::で静的メソッドにアクセスする
<?php
class Car{
#インスタンスプロパティ
public $number;
private $speed;
private $serial = 0;
#静的プロパティ(インスタンス化しなくても使える)
private static $carNumber = 0;
function __construct($number) {
$this->number = $number;
echo "construct{$number}" . "<br>";
}
#カプセル化している変数にはsetter
public function set_speed($speed){
$this->speed = $speed;
}
public function get_speed(){
return $this->speed;
}
public function drive(){
echo "「{$this->number}」が{$this->speed}キロで走行<br>";
}
public function stop(){
echo "「{$this->number}」が停車<br>";
}
#静的メソッド (インスタンス化しなくても使える)
public static function showCarNumber(){
$number = self::$carNumber;
echo "生産台数:{$number}<br>";
}
}
#静的メソッド (インスタンス化しなくても使える)
Car::showCarNumber();
?>
<?php
#ファイルのインポート
require_once("car.php");
#インスタンス化
$car = new Car("そ 43-52");
$car->set_speed(40) ;
$car->drive();
$car->stop();
Car::showCarNumber();
?>
感想
- 記法自体はjavaとrubyを混ぜた感じ
- フロントに置いてHTMLライクな感じがVueに似ている
- ->など結構ほかの言語にない、記号が多い
- formはすごく簡単に作れる
- 型がない言語はやっぱり違和感
- フロントのphpは開発で使ってないので、バックエンドのみで使用してみたい
基本的に他の言語と変わらないので、基礎はこれくらいで十分かなと思います。
フロントエンドのformは分かりやすい記述で、すごく簡単に作れるのは素晴らしいなと思いました。
foreachの順番が他の違うのと、$や->を普段使用しないので少し苦戦しました。
コメント