MMAオタクは夢を見る

一児の父のITエンジニアが送る日常記録

プログラミングPHPを自分の言葉で書いてみる vol.1

PHPの歴が2年あるのに、よくわかってない構文が多かったので改めて勉強をしています。

本はこちら

PHPの基本

大文字・小文字の区別について

  • ユーザー定義関数・キーワード

    • ユーザー定義の関数、クラス名、whileやechoなどの組み込みキーワードは大文字・小文字を区別しない為、変えても実行される
  • 変数名

    • 大文字・小文字を区別する

<?php の終了タグは直前の命令文は、セミコロンがなくても実行できる

これは知らなかったので驚きました、以下のような状態が成立します。

<?php 

echo 'これはAppleです';

echo '<br>';

echo 'これはLemonです'

?>
  • ただしあまりバグを生む可能性があることや、PHPの終了タグがないとダメなことなど条件がある為、基本はセミコロンをつけること

コメントアウトについて

  • シェル方式 #が使えるよ
  • C++方式 // が使えるよ
  • C方式 / / が使えるよ
    • C方式に関しては、ネストさせると後に書かれた閉じコメントが普通のPHPのコードと実行されてエラーになる為注意

リテラル

  • プログラムに直接書かれたデータのことで、文字列や、数値型など

データ型

スカラー

  • 単一を表す型のことで、プリミティブ型に近い、文字列、整数や、不動小数点、論理値など

整数型

  • 実行されている環境により異なるが、整数範囲の限界がある
    • 一般的には、-2,147,483,648 ~ 2,147,483,647 の間をPHPで扱うことができる
  • 整数リテラルは、以下の4種類を扱うことが可能
    • 10進数、8進数、2進数、16進数

浮動小数点型

  • 浮動小数点型は、精度15桁になっている(小数点15桁まで正確でそれ以降は丸られる)
    • コンピュータで2進数表記する場合に、正確に表現できないケースがあるため浮動小数点は正確な数値は出せない
  • そのため、比較を行うのであれば、基本的には整数に治して比較
    • もしくは、二つの数値を計算した誤差を、事前に定義した閾値に沿っているかどうかで判断をする

文字列型

  • シングルクォートとダブルクォートで表現できる
  • ダブルクォートで表現する場合は、変数を内部で展開できる
  • ダブルクォートの場合は、内部でエスケープシーケンスを使用できる

論理型

  • PHPでは以下の値は、false扱いされる
    • キーワードfalse
    • 整数値0
    • 浮動小数点数値0.0
    • 空の文字列、もしくは"0"
    • 素数がゼロの配列
    • null値

オブジェクト型

リソース

  • データベースや、ファイルにアクセスなどPHPの外部システムを利用するときに使われる
  • 通常は関連するメソッドが入る
  • リソースはPHPが参照を終えることで、自動で接続を解除できる
    • ゆえに関数内のローカル変数などで利用すると便利
  • 基本的には、自動的な後始末に頼らず明示的に接続を解除した方がいい

PHPの基本構文編

変数

  • 識別子の頭文字に$マークをつける
  • コンパイル時、実行時に型チェックを行わない
  • 値が設定された時点で、その変数がメモリに作成される

可変変数

  • 変数名の識別子を文字列で動的に扱える
  • 以下のようにして扱う
$foo = 'bar';
$$foo = 'baz';
  • $barの変数を参照すると、$fooで宣言をした、識別子barの変数を参照し、$barの中に'baz'が格納される仕組み

変数への参照

  • 変数を参照渡しすることができる構文
// 変数への参照を利用した例
$foo = 'test';
echo 'foo: ' . $foo;
echo nl2br("\n");
$bar = & $foo;
$bar = '書き換え';
echo 'bar: ' . $bar;
echo nl2br("\n");
echo 'foo: ' . $foo;

変数のスコープ

  • 変数の宣言された場所によってアクセスを制御できる概念
    • 全4種類ある
      • ローカル
      • グローバル
      • スタティック
      • 関数のパラメータ

ローカルスコープ

  • 関数内で定義された変数は、定義した関数内でしか参照できないというもの
  • 関数の外部で定義した変数も、関数の内部からアクセスすることはできない
// ローカルスコープを体験する
function updateConter() {
    $counter = 5;
    $counter++; // ローカル変数
    echo $counter;
    echo '<br>';
}

$counter = 10; // グローバル変数
updateConter(); // ローカル変数の$counterを加算

echo $counter;
  • グローバルスコープ
    • 関数の内部から、外部の変数にアクセスする場合は、関数ないでglobal宣言を行う必要がある
    • globalスコープを宣言するには、globalキーワードを使用するか、GLOBALS配列を使用して宣言をする
// globalキーワード
function updateConter() {
    global $counter;
    $counter++; // ローカル変数
}

$counter = 10; // グローバル変数
updateConter(); // ローカル変数の$counterを加算

echo $counter;

// GLOBALS配列
function updateConter() {
    $GLOBALS['counter']++;
}

$counter = 10; // グローバル変数
updateConter(); // ローカル変数の$counterを加算

echo $counter;

スタティック変数

  • 関数内部だけで値を保持できるキーワード
  • 通常呼び出すたびに初期化される関数内のローカル変数の値を保持させることができる
function updateConter() {
    static $counter = 0;
    $counter++; // ローカル変数
    echo $counter . '<br>';
}

$counter = 10; // グローバル変数
updateConter(); // ローカル変数の$counterを加算
updateConter(); // ローカル変数の$counterを加算

echo $counter;

メモリの解放

ガーベッジコレクション

  • プログラムの使用していないデータを自動的にメモリから解放する仕組みのこと
  • PHPではは参照カウンタを使用し、書き込み時に初めてコピーするコピーオンライト方式のメモリ管理を採用している

シンボルテーブル

  • 変数や、関数、クラスが割り当てられているメモリのアドレスや、メモリを解放する基準となる参照カウンタの情報群

参照カウンタ 

コピーオンライト方式

  • 変数aを変数bに代入するときにそのままデータのコピーを行わず、シンボルテーブルの参照情報のみ共有させること
  • 変数bへの値の更新が行われた際に初めてメモリ上へデータのコピーを行うため、メモリを効率的に使うことができる仕組み

なんとなく、理解していたことを改めてしっかり言語化できたそんな日でした。

リーダブルコードを自分の言葉で書いてみる vol.1

発端

会社で、リーダブルコードの理解度について質問をされた時に、少し自信がなかったのでこれを機に自分の言葉で振り返ってみる

1章 理解しやすいコード

この章の中で、優れたコードについて触れられている

本書が提唱する優れたコードとは理解しやすいコードと書かれている では理解しやすいコードって一体どんなコードだろう

※筆者はPHPerなので、PHPで書きます。

  • 行数の短い条件分岐
$isMax = $max_number > REQUEST_LIMIT ? true : false;
  • 行数の長い条件分岐
$isMax = false;
if ($max_number > REQUEST_LIMIT) {
  $isMax = true;
}

優秀なコード理解しやすいコードだとしたら、どちらが理解しやすいだろうかというのがこのテーマの内容

個人の主観だけだと場面にもよるが、メイン処理から呼び出される側の関数内には、行数の短い条件分岐 メイン処理側では、行数の長い条件分岐などで使うことが多いかなと考えている

ただそれも理由がなく、なぜかと聞かれると理由はない

確認項目

三項演算子と、if文の使い分けは一般的にどのように使い分けるか

理解しやすいの定義って?

本書では、理解しやすい = 理解するまでの時間が短いことだと書かれている

では理解しやすいとは具体的にどういうことなんだろうか

2章 名前に情報を詰め込む

この章の結論としては、明確な変数名をつけましょうになると思う

例えば以下のような関数が取り上げられている

function getData(Object $params): Object {
  $retval = fetchPlayerData($params);
  $retval = parsePlayerPointer($retval);
  return $retval;
}

この関数には2つの問題がある * getDataでは何を取得するのかわからない * $retvalは、戻り値のことを表している単語だが戻り値が戻るのは当たり前なので不適切

本書で取り上げられている好ましい書き方は以下だ

function fetchPlayerPoint(Object $params): Object {
  $playerData = fetchPlayerData($params);
  return parsPlayerPointer($playerData);
}
  • これで取得したユーザーデータのポイントだけ取得している処理とわかる

英語には多種多様の表現があるので、なるべく読み手がわかるような変数や関数の命名をしましょうねということらしい。

まとめ

  • 優れたコードは、読み手が内容を理解する速度が短いコードのこと
    • 必ずしもコード量が少ない = 読みやすいコードではない
  • 変数名、関数名は、汎用的な名前は避けて具体的な名前をつけること

何はともあれ記事を書こうと決めた日

私は、現在33歳のしがないITエンジニアです。

最近1児の父親となりました。

 

父親になって初めて父性が芽生えて、初めて自分の仕事について真剣に考えるようになりました。

 

これまでは、どこか周りに流されて生きてきて、もしかしたらこれからも流されて生きていくかもしれませんが、

そういった自分の性分に抗いたいと考えるようになり、ブログを作ることにしました。

 

ブログを色々な人に見てもらっている意識を持ちながら、少しずつ自分のことを知ってもらえるといいなと思います。

 

ざっと経歴ですが、大学卒業後、新卒から29歳までは営業の補佐をするバックオフィス業務に従事していました。

 

30歳になる年に、コロナウイルスが流行り会社の先行きが不安になる中で自分の人生本当にこのままでいいのか考えるようになりITエンジニアの勉強を始めました。

 

1年ほど学習して、2年間で2社経験し現在は、業界歴は3年目といったところです。

 

IT業界の中でも色々と経験しており、アプリケーションの開発業務、インフラの管理運用、ユーザーサポート対応などさまざま携わらせていただきました。

 

そんな中、子供が生まれ、育児休業を機に自分の人生をより良いものにしたいと考えるようになり、ブログを作成したという流れです。

 

普段は学習のアウトプットに使うことが主な用途になると思います。

 

雑多な内容になるかと思いますが、誰かに見てもらえると嬉しいです。

気軽にコメントくださいね。