投稿

[AWS]Amazon EC2

イメージ
AWSの無料利用枠(アカウント作成から1年)を使って、EC2インスタンスを起動してブラウザからHTTPアクセスするところまでをまとめます。 EC2インスタンスを作成 EC2インスタンスを作成する EC2 > インスタンス > インスタンスを起動 をクリックして以下の項目を入力・選択します。 インスタンス名、OSイメージ インスタンス名は任意の名前、OSイメージは自分の扱いやすいOSを選択します。ここではUbuntuを選択しました。 インスタンスタイプ、キーペア インスタンスタイプ インスタンスタイプは無料枠で利用可能な t2.micro を選択します。 キーペア EC2インスタンスの作成後、SSH接続して各種必要ソフトなどのセットアップを行います。その際必要になるのがキーペア(公開鍵と秘密鍵)を作成します。公開鍵はEC2インスタンス内に保存され、秘密鍵はユーザー自身がクライアント端末で管理します。 キーペア名 任意の名前 キーペアのタイプ RSA プライベートキーファイル形式 .pem 作成するとプライベートキー(.pem)ファイルがダウンロードされるので、ローカルの任意の場所へ保管しておきます。 ネットワーク設定 AWSには既存のセキュリティグループが一つ用意されているので、既存のセキュリティグループを選択します。 インスタンスを起動 インスタンスを起動をクリックして少し待ち、以下のような画面になればひとまずOKです。 アプリケーションセットアップ 作成したEC2インスタンスにSSHで接続し、アプリケーションのセットアップをします。 SSH接続 構文: ssh -i [プライベートキー] [EC2インスタンス] SSHコマンドは EC2 > インスタンス > [作成したインスタンス] > 接続 > SSH から確認できます。 SSH接続: $ ssh -i "test-key.pem" ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com Are you sure you want to continue connecting (yes/n

Amazon CodeWhispererを使ってみた

イメージ
AIがコメントや書きかけのコードから、次のコードを提案(サジェスト)してくれるAmazon CodeWhispererが正式リリースされました。 これまでGitHub Copilotという強力なコーディング支援AIがありましたが、こちらは月額1,000円かかるためなかなか個人利用では手が出しにくいと思っていました。そこへAmazon CodeWhispererが正式リリースされ、こちらは個人利用に限り無料で利用可能ということなので早速使ってみました。 事前準備(Visual Studio Code) 準備するもの VSCode(IDE) AWSアカウント AWS Builder ID サポートしているIDEにはIntelliJ IDEA、Pycharm、Webstorm、VSCode、AWS Cloud9があります。今回はVSCodeを使用します。 AWS Builder IDはAWSでアプリケーションをビルドする人にとっての個人プロファイルで、Amazon CodeWhispererなどの一部のAWSサービスを利用する際に必要になるIDです。 拡張機能インストール VSCodeを開き、ExtensionsからAWS Toolkitをインストールします。 AWS Builder IDでサインイン AWS Toolkitのメニューを開き、Connected with AWS Builder IDをクリックします。するとダイアログでAWS Builder IDへ接続するための一時コードが発行されますので、「Copy Code and Proceed」をクリックします。(クリップボードにコピーされ次へ進みます。) 次のダイアログで「Open」をクリックすれば、ブラウザが立ち上がり、認証画面が開きます。 認証画面が開くと、VS Code上で認証コードが表示されますので、これをコピーしてCodeに張り付けてNextをクリックします。 次に出てくるAWS Builder IDの認証画面では、登録済みのEメールアドレスとパスワードで認証を行います。画面がCreate Accountになっている場合は、下部のボタンでSign inに切り替えることができます。 AWS Builder IDはこの時点で作成することもできま

[Azure] ネットワークセキュリティ

イメージ
仮想ネットワークのトラフィック制御についてです。 NSG (Network Security Group) ネットワークセキュリティグループ(以下NSG)は、仮想マシン等のリソースが送受信するネットワークトラフィックを制御するためのファイヤーウォール機能を提供する。 NSGは、仮想ネットワークのサブネット、もしくはネットワークインターフェースに関連付けて対象リソースの送受信トラフィックを制御する。 NSGは、インバウンド(受信)セキュリティ規則と、アウトバウンド(送信)セキュリティ規則で構成される。 サブネットとネットワークインターフェースに異なるNSGを関連付けた場合、両方のセキュリティ規則に許可されないとトラフィックは拒否される。 仮想ネットワークを作成した段階で既定の送受信セキュリティ規則が作成され、サブネットに割り当てられる。 NSGの作成の流れ NSGの作成 NSGの名前と適用範囲を指定する。 NSGの構成 NSGに適用するセキュリティルールを構成する。 NSGの割り当て ネットワークインターフェースまたはサブネットにNSGを割り当て、セキュリティルールを有効にする。 NSGで構成可能な項目 ソース(送信元) Any すべての送信元 IPアドレス 単一のIPアドレス、CIDR形式のIPアドレス、カンマ区切りで複数のIPアドレス サービスタグ Azureが提供するサービスや認識するネットワーク単位での指定 ASG 定義済みのApplication Security Group ソースポート範囲 送信元のポート範囲を0~65535で指定する。(※ワイルドカードですべてのポートを指定可能) 宛先 宛先のアドレスなどを、ソース(送信元)と同様の構成で指定する。 サービス ソースポートと同様の設定を簡単にするための構成で、サービス名を指定すると宛先ポートが自動で構成される。 宛先ポート範囲 宛先のポート番号をソースポートと同様の構成で指定する。 プロトコル 利用するプロトコルを指定する。指定可能なプロトコルは以下 Any TCP UDP ICMP アクション 定義した規則にあてはまったトラフィックに対して行う動作「許可

[Azure] ネットワークの基本

イメージ
Azureの仮想ネットワークについての概要、およびサイト間接続について概要をまとめました。 Virtual Network (仮想ネットワーク) 仮想ネットワークは、Azure内で各リソースが通信を行うための最も基本的な要素で、1つのAzureリージョン・1つ以上のサブネットで構成される。 仮想ネットワークの構成 仮想ネットワークを構成する要素には以下のものがある。 IPアドレス プライベートIPアドレス 仮想ネットワーク内で利用するアドレスで、Azureの内部でのみ利用できる。仮想マシンの場合は、VNIC(仮想ネットワークインターフェース)にプライベートアドレスが紐づけられる。 パブリックIPアドレス 仮想マシンやAzure Firewall、ロードバランサーなどの外部からアクセスを受け付けるリソースに対して設定し、外部との通信が可能になる。 IPアドレス空間 仮想ネットワークで利用できるアドレスの範囲で、通常はプライベートIPアドレスの範囲を設定する。複数のアドレス範囲を指定できる。 サブネット 仮想ネットワークに設定されたアドレス空間に含まれるアドレス範囲を指定して、サブネットを構成することができる。仮想ネットワークに構成されたサブネットは自動的にルーティングされるので、仮想ネットワーク内のサブネット同士はすぐに通信が行える。 まとめ 仮想ネットワークは、アドレスの範囲をアドレス空間で指定する。 仮想ネットワークは、必ず1つ以上のサブネットを持つ。 サブネットは、アドレスの範囲を属する仮想ネットワークの範囲内で指定する。 この時、 仮想ネットワーク内の複数のサブネットで、アドレス範囲が重複してはならない 。 仮想ネットワーク内でのリソース同士は、プライベートIPアドレスで通信通信が可能だが、異なる仮想ネットワーク間での通信は規定ではできない。 Virtual network peering (ピアリング) ピアリングは異なる仮想ネットワーク同士を相互通信する機能で、Azureのバックボーンを利用して仮想ネットワークを拡張できる。 ピアリングは異なる仮想ネットワークの通信を可能にする。 接続する仮想ネットワークの双方にピアリングの設定が必要。

Visual Studio Code 拡張機能まとめ

イメージ
VSCodeには便利な拡張機能がたくさんありますが、ここでは私がよく使用している拡張機能について3つほどまとめてみました。VSCode拡張機能については今後も定期的にまとめていきたいと思います。 Project Manager Project ManagerはVSCodeで複数プロジェクトの開発をしている場合、簡単に切り替えることが出来る拡張機能です。 設定 設定方法は簡単で、インストール後にProject Manager拡張機能を開き、「Edit Projects」ボタン(鉛筆マーク)でプロジェクトの設定をJSONファイルで編集します。 設定項目 1. projects.json name プロジェクト名 rootPath プロジェクトのパス tags タグ (配列で複数指定可能、検索で使用する) enabled 有効フラグ (true or false) 設定例 [ { "name": "laravel-project", "rootPath": "\\\\wsl.localhost\\Ubuntu\\home\\{username}\\laravel-project", "tags": [], "enabled": true }, { "name": "test-project", "rootPath": "C:\\work\\test-project", "tags": [], "enabled": true } ] イメージ 上記の例を保存して再度Project Managerを開くと、以下のように設定したプロジェクトが一覧表示されます。あとは任意のプロジェクトを選択するだけで、プロジェクトを切り替えることが出来ます。 Draw.io Integration Dra

[資格] PHP7技術者認定初級試験

以下記事の通り、PHP8技術者認定試験の上級は合格しましたが、初級レベルにあたる「 PHP7技術者認定試験初級 」を持っていないので、近日中に受験します。また、その際の振り返りはこのブログ内に記載しようと思ってます。 PHP技術者認定試験については、以下記事を参照してください。 https://www.s-watanabe.work/2022/12/php8.html この記事では、PHP7技術者認定試験初級についての情報や学習方法などをまとめていきます。 PHP7技術者認定初級試験 試験の情報についての詳細は以下の公式ページにありますのでここでは割愛します。 https://www.phpexam.jp/summary/novice7 ざっと見た感じでは、PHPの基本はもとより、かなり幅広い内容となっていて試験内容のボリュームがありそうです。 パッケージ管理やフレームワークなどが入っているところを見ると、より専門的な技術スキルが求められるPHP8上級よりか実践に近い内容となっているのかもしれません。こっちを先に受験すべきでした。。 学習方法 公式テキスト PHP8上級試験と違ってこちらは公式から問題集が出ていますので、これを使って繰り返し問題を解くのが合格への近道だと思います。 徹底攻略PHP7技術者認定[初級]試験問題集 安定の黒本、徹底攻略シリーズ PHP7技術者認定[初級]試験に完全対応した公式問題集 また、受験宣言することで抽選でこの問題集をもらえるキャンペーンが実施されています。詳細は以下をご確認ください。 https://www.phpexam.jp/archives/2477 Prime Study Prime Strategyより無料で模擬試験が配信されていますのでこちらを利用します。 https://study.prime-strategy.co.jp/ PHP8上級試験の対策の際は大変お世話になりました。その際の感覚で言うと、かなり本番に近い形式の内容となっています。PHP8の時は、回答について解説がなく、以下のように学習しました。 分からない関数などは公式のオンライン

Windows10に構築したDocker+Laravel開発環境をWSLへ移行する

イメージ
Windows10の環境でDocker+Laravelの環境で開発をしていて、Webレスポンスが非常に遅く開発に支障が出ているため、WSLに移行してかなり改善されたのでその際の手順をまとめます。 githubの設定 SSHの鍵ペアを作成 ファイル名はデフォルト、パスフレーズは無しで秘密鍵と公開鍵のペアを、ssh-keygenコマンドで生成します。 $ cd ~/.ssh $ ssh-keygen 完了すると、以下の2ファイルが生成されます。 ~/.ssh/id_rsa (秘密鍵) ~/.ssh/id_rsa.pub (公開鍵) 公開鍵をgithubへ設定 以下の手順で、id_rsa.pub (公開鍵)の内容をgithubへ設定します。 1. id_rsa.pub (公開鍵)の内容を出力 $ cat ~/.ssh/id_rsa.pub 2. githubへSign in https://github.com/login 3. New SSH Key Settings -> SSH and GPG keys -> New SSH Key をクリック 4. SSH Key 設定内容 以下のように設定して、Add SSH Keyをクリック Title 任意のタイトル Key type Authentication Key Key 1で出力したid_rsa.pub (公開鍵) を貼りつける 以下のように一覧に追加されればOK ソースコードをcloneする ここまでの作業で、WSL内でgithubを利用する準備が整ったので、githubからソースコードをcloneします。 $ git clone git@github.com:s-watanabe-apps/laravel-project-test.git なお、この時cloneするリポジトリのリンクは、githubで任意のリポジトリを開き、Code -> SSH の順にクリックして確認できます。 動作確認① この時点でDocker Desktopが実行されていれば、コンテナを立ち上げることが出来ます。 $ docker-compose up -d Starting laravel-project

[資格] PHP8技術者認定上級/準上級試験

PHP8技術者認定上級/準上級試験を受けてきてなんとか合格できたました。 PHP技術者認定試験について 概要 PHP技術者認定試験はPHP技術者認定機構が開催する試験で、PHPのバージョンと試験レベルにより別れています。現在は以下の試験が配信されています。 PHP5初級試験 PHP7初級試験 PHP5上級試験 PHP8上級試験 (今回受けた試験) 受験について PHP技術者認定試験の受験方法は、オデッセイコミュニケーションズのテストセンターでCBT(Computer Based Testing)により配信されていますので、会員登録して試験の予約をします。 https://cbt.odyssey-com.co.jp/ PHP8上級 PHPの言語仕様から実用的なプログラミングテクニックまでのスキル・知識を問われる試験です。 試験情報 1. PHP8上級試験情報 試験名 PHP8技術者認定上級/準上級試験 問題数 30問 試験時間 120分 合格ライン 5割正解:準上級、7割正解:上級 受験料(税込み) ¥16,500 前提条件 無し、誰でも受験・認定可能 参考書 PHP8上級試験専用の問題集やテキストは現在のところ(2022年12月)無さそうです。以下の標準テキストを参考にしました。 独習PHP 第4版 PHP8を学ぶための標準教科書 試験範囲の大部分をカバーできる 学習方法 Prime Studyの模擬試験 Prime Studyより無料の模擬試験が配信されているので、まずこちらを利用しました。誤記等が少しありますが、実際の試験にかなり近いです。 ただし回答についての解説などはないので自分で調べる必要があります。 https://study.prime-strategy.co.jp/ 実際に動かして動作を確認 Prime Studyの模擬試験は解説がないので、実際に動かし

[PHP] WEBアプリケーションの脆弱性 - XSS(クロスサイトスクリプティング)脆弱性と対策について

イメージ
XSS(クロスサイトスクリプティング)についてと、PHPにおけるXSS対策についてまとめます。 XSS(クロスサイトスクリプティング)とは クロスサイトスクリプティング(以下XSS)とは、Webサイトの脆弱性を突いた悪意のある攻撃のことを言います。 その多くは、スクリプトによってWebページを改ざんしたリンクを用意し、そのリンクを踏んだ第三者の個人情報やID/PASSWORD等の機密情報を抜き取る手口が上げられます。 XSSの概要図 まず攻撃者は、正規のサイトに悪意のあるスクリプトを埋め込みWebページを改ざんします。実際に正規サイトのWebページを書き換えるわけではなく、スクリプトを埋め込んだリンクを用意して、Webページの利用ユーザーがリンクを踏むのを待ちます。 Webページ利用者は、攻撃者が用意したリンクを踏んでしまうと、悪意のあるスクリプトによってWebページが改ざんされた状態でブラウザに表示されます。例えば、ログイン画面のformタグのacsion属性を書き換えられてしまうと、ログイン情報(ID/PASSWORD)が、攻撃者が用意したサーバーにPOSTされてしまう等の被害が考えられます。 上記の通り改ざんされたWebページから攻撃者の用意したサーバーへ機密情報が送信されたり、偽サイトへ誘導されてしまいます。最初に表示されるページが正規サイトのページなだけに、閲覧者は気づきにくく非常に危険です。 なお、この時のデータの流れが、攻撃者→正規サイト、閲覧者→偽サイト、とクロスすることからクロスサイトスクリプティングと名づけられています。 XSS脆弱性のコード もっとも簡単な例でXSS脆弱性を再現してみます。 index.html まずは簡単なFormとSubmitボタンがあるWebページを用意します。 <html> <head> <title>XSS検証</title> </head> <body> <form action="/xss-test/test.php" method="POST"> <input type="tex

[PHP] NULL判定を行う演算子

変数の値がNULLの時に初期値を設定するようなコードは、これまでif文でisset関数やempty関数、is_null関数などを使って判定し初期値を代入していましたが、NULL判定用の条件演算子、NULL判定用の代入演算子を使うことで簡潔に記述できるようになりました。 NULL判定を行う条件演算子 構文 変数 ?? 初期値 [実装例]変数のNULL判定 以下の例では、変数$var1、$var2、$var3、$var4に対してNULLの場合に初期値を代入しています。 注意する点としては、対象の変数が未定義の場合($var2)もNULLとして扱われ、空文字($var3)の場合はNULLとして扱われない点です。 コード $var1 = null; //$var2 $var3 = ""; $var4 = 1; $var1 = $var1 ?? 'default'; $var2 = $var2 ?? 'default'; $var3 = $var3 ?? 'default'; $var4 = $var4 ?? 'default'; echo "var1=", $var1, "\n"; echo "var2=", $var2, "\n"; echo "var3=", $var3, "\n"; echo "var4=", $var4, "\n"; 実行結果 $ php test_null.php var1=default var2=default var3= var4=1 NULL判定を行う代入演算子 構文 変数 ??= 初期値 [実装例]変数のNULL判定 代入演算子を使って記述すると、上記のコードをさらに簡潔に記述することが出来ます。実行すると同じ結果になります。 $var1 = null; //$var2 $var3 = ""; $var4 = 1; $var1 ??= 'default'; $var2 ??= 'default';

[PHP] エラー出力の制御について

イメージ
PHPのエラー出力の制御は、php.iniのerror_reportingに設定する方法と、もしくはプログラム実行時に関数で設定する方法があります。 プログラムで設定する場合は、ini_set関数で設定するか、専用のerror_reporting関数で設定する方法があります。 error_reporting関数 error_reporting関数は、引数にエラーの種類を表す定数を指定し、どの種類のエラーを出力するのかを設定することが出来ます。 なお引数の設定値はint型のため数値リテラルを設定することもできますが、組み込み定数を使って指定することが推奨されています。 公式マニュアル: https://www.php.net/manual/ja/function.error-reporting.php error_reporting関数のシグネチャ 1. error_reporting関数 引数 int (error_level) ※PHP8.0からnullの指定が可能、nullの場合はデフォルト(32767)が設定され、すべてのエラーを出力する設定になる。 戻り値 int $error_level引数指定ありの場合は、変更前のエラーレベルを返す。 $error_level引数指定なしの場合は、現在のエラーレベルを返す。 error_levelについて error_levelはPHPコアに組み込まれており、いつでも利用できます。 2. error_level定数 E_ERROR (1) 重大なエラー、復帰不可能なためスクリプトは中断する E_WARNING (2) 実行時の警告、スクリプトは続行できる E_PARSE (4) コンパイル時のパースエラー E_NOTICE (8) 実行時の警告、スクリプトは続行できる E_ALL (32767) 全てのエラーを出力する 0 全てのエラーを出力しない、定数は無し

[PHP] 参照(リファレンス)について

参照(リファレンス)とは、メモリ上のアドレスそのものを代入し、複数の変数を同一のものとして扱うことが出来ます。 ここではPHPのリファレンスについて正しく理解するためにまとめます。 リファレンスの代入 構文 変数の前に「&」を付けると、変数のメモリ上のアドレスであるリファレンスを取得することが出来ます。 &変数 [実装例]リファレンスの代入 コード 以下の例では、変数$aの参照を変数$bに代入し、そのあと変数$bを更新しています。 $a = 1; $b = &$a; $b = 2; var_dump($a, $b); 実行結果 実行すると変数$a、$bどちらも同じように更新されていることが分かります。 $ php test_reference.php int(2) int(2) [実装例]リファレンスの解除 コード unset関数でリファレンスの解除が出来ます。 $a = 1; $b = &$a; unset($b); $b = 2; var_dump($a, $b); 実行結果 $ php test_reference.php int(1) int(2) 参照渡し 関数やメソッドの引数に、変数の参照を渡してやることが出来ます。 [実装例]参照渡し コード 以下の例では、関数addVarの引数を参照渡しにして、関数内で$varの値を更新しています。 function addVar(int &$var) { $var++; } $var = 1; addVar($var); var_dump($var); 実行結果 実行結果は、関数の外で宣言された$varの値が更新されていることが分かります。 $ php test_reference.php int(2) 変数以外を渡すとエラー 参照渡しが設定されている引数に、変数以外の値を直接渡すことはできません。 例えば関数addVarの呼び出しを、 addVar(1); とすると、以下のエラーが発生します。 $ php test_reference.php Fatal error: Uncaught Error: addVar(): Argument #1 ($var) cann

[PHP] マジックメソッド - クラスオブジェクトについての処理

クラスのオブジェクトに関するマジックメソッドについて3つほどまとめます。 __toStringメソッド __toStringメソッドは、クラスのオブジェクトを文字列として出力しようとした際に呼び出されるマジックメソッドです。 通常クラスのオブジェクトは、文字列として出力しようとしてもconvertエラーとなってしまい出力できません。 class Test { private string $name; public function __construct(string $name) { $this->name = $name; } } $test = new Test("Hoge"); echo "name=", $test, "\n"; $ php test_magic-method.php name= Fatal error: Uncaught Error: Object of class Test could not be converted to string in .¥test_magic-method.php:101 Stack trace: #0 {main} thrown in .\test_magic-method.php on line 101 これを解決するのが__toStringメソッドです。 マジックメソッドのシグネチャ 1. __toStringメソッドのシグネチャ アクセス修飾子 public メソッド名 __toString 戻り値 string [実装例]クラスオブジェクトの文字列変換 冒頭のコードに__toStringメソッドを実装して、文字列に変換した場合の出力を指定します。 コード class Test { private string $name; public function __construct(string $name) { $this->name = $name; } public functi

[PHP] マジックメソッド - 未定義属性の処理

マジックメソッドとは、クラスに定義されるメソッドで、あらかじめ役割が決められたいくつかのメソッドのことを言います。 以下の記事で取り上げたコンストラクタとデストラクタについても、マジックメソッドの一種です。 https://www.s-watanabe.work/2022/12/php_11.html ここでは、未定義の属性への操作しようとしたときに呼び出されるメソッドについてまとめていきます。 __setメソッドと__getメソッド PHPは基本的に未定義の属性へのアクセスが可能になっています。例えば以下のコードはエラーにならずに実行可能です。 class Test { } $test = new Test(); $test->name = 'Hoge'; echo "name=", $test->name, "\n\n"; var_dump($test); 実行結果は以下のようになります。 $ php test_magic-method.php name=Hoge object(Test)#1 (1) { ["name"]=> string(4) "Hoge" } この属性をセットする時の処理を制御するのが __setメソッド、属性を取得する処理を制御するのが __getメソッドです。 マジックメソッドのシグネチャ __setメソッド 1. __setメソッドのシグネチャ アクセス修飾子 public or なし メソッド名 __set 第一引数 string (属性名) 第二引数 mixed (値) 戻り値 void __getメソッド 2. __getメソッドのシグネチャ アクセス修飾子 public or なし メソッド名 __get 第一引数 string (属性名) 戻り値 mix

[PHP] コンストラクタとデストラクタ

コンストラクタ PHPでクラスを利用する際に、最初にnew演算子によってクラスのインスタンスを作成するという作業を行いますが、この時に実行されるメソッドをコンストラクタと言います。 コンストラクタは省略可能で、省略した場合引数を持たないデフォルトのコンストラクタが内部的に用意されます。 コンストラクタの定義構文 public function __construct(引数) { // プロパティなどの初期化処理 } [実装例]コンストラクタでメンバー変数を初期化する コード class Test{ private int $id; private string $name; public function __construct(int $id, string $name) { echo __METHOD__, "\n"; $this->id = $id; $this->name = $name; } } $test = new Test(1, "Test Name"); var_dump($test); 実行結果 $ php test_construct.php Test::__construct object(Test)#1 (2) { ["id":"Test":private]=> int(1) ["name":"Test":private]=> string(9) "Test Name" } [間違った実装例]引数なしのコンストラクタを呼び出す 引数ありのコンストラクタを定義した状態で、引数なしのコンストラクタを呼び出すとエラーになります。コンストラクタをクラスに明示的に定義した時点で、デフォルトのコンストラクタは無効になります。 コード class Test{ private int $id; private string $name; public function __construct(int $id, string $na

[PHP] 抽象クラスとインターフェース

PHPの抽象クラスとインターフェースについてです。 抽象クラス 抽象クラスは継承される前提のクラスで、それ自体ではインスタンスを生成することが出来ないクラスです。 インスタンスは生成できませんが、メソッドやプロパティは持つことが可能で、これらは基本的に継承されたサブクラスから呼ばれて扱われます。 抽象クラスの最大の特徴は、抽象メソッドを持つことが可能です。抽象メソッドとは、処理を記載しないメソッドで、サブクラスでオーバーライドされて処理が実装されます。 抽象クラスを継承したサブクラスでは、抽象メソッドを必ずオーバーライドしなくてはなりません。 抽象クラスと抽象メソッドの定義構文 abstract class 抽象クラス名 { abstract function 抽象メソッド名(シグネチャ) : 戻り値(任意); } [実装例]抽象メソッドをオーバーライドする コード abstract class TestAbstract { abstract function printName(string $name) : void; } class Test extends TestAbstract { function printName(string $name) : void { print "Hello {$name}.\n"; } } $test = new Test(); $test->printName("abstract"); 実行結果 $ php test_abstract.php Hello abstract. [実装例]抽象クラスからサブクラスに継承されたメソッドを実行する 抽象クラスに定義されたメソッドから、サブクラスに継承されたメソッドを実行することが出来ます。 コード 以下の例ではTestクラスでオーバーライドされたprintNameメソッドを、親クラスであるTestAbstractクラスのtestメソッドから呼び出しています。 抽象クラス事態はインスタンスを持つことはできませんが、サブクラスであるTestクラスのインスタンスがあるため、testメソッド内で$thisキーワードが使用できます。 abst

[PHP] static修飾子について

static修飾子を使った静的変数、静的プロパティ、静的メソッドについてです。 静的変数 関数内で定義された変数のスコープはローカルスコープと言い、呼び出し元のスコープや外部のスコープからは参照できず、関数が終了したら値ごと破棄されます。 しかし、変数を静的変数で定義することで、変数の値を関数終了後も値を維持しておくことが可能です。 定義 static 変数; [実装例] 通常の変数定義 コード 以下のコードは通常の変数定義です。 function counter() { $var = 0; $var++; return $var; } $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; 実行結果 ローカル変数 $var の値は counter関数が終了するたび破棄されるので、何度呼び出しても結果は変わりません。 $ php test_static.php count=1 count=1 count=1 [実装例] 静的変数での変数定義 コード 以下のコードは変数 $var を、静的変数で定義した例です。 function counter() { static $var = 0; $var++; return $var; } $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; 実行結果 $var の値はcounter関数の終了後も保持されているのが分かります。 $ php test_static.php count=1 count=2 count=3 静的プロパティ クラスのプロパティをst