Vagrant – phpMyAdminのインストール – CentOS7

phpMyAdminのインストール

PHPをRemiリポジトリーからインストールしているので、phpMyAdminもRemiリポジトリーからインストールする。

ポートの設定

Vagrrant環境の場合、VagrantfileでApacheで使うポートを設定しておく必要がある。

Apacheの起動確認

Apacheの起動状態を確認。

停止していればApacheを起動。

403エラー

ここまでの状態でlocalhost:8080/phpMyAdminにアクセスすると、403エラーになった。

phpMyAdmin.confの修正

/etc/httpd/conf.d/phpMyAdmin.confを以下のように修正する。

修正後はApacheを再起動。

起動成功

localhost:8080/phpMyAdminでログイン画面が表示される。

 

Vagrant – Apache – CentOS7

導入

ポートフォワーディング

Vagrantfileの以下の行のコメントを外すか、行がなければ記述。

Vagrantfile修正後はVagrantを再起動。

httpdの状態確認と起動

httpdの稼働状況を確認。

停止しているなら起動。

接続確認

ホストのブラウザーからlocalhost:8080にアクセス。

 

Laravel – 例題 – Rock-Paper-Scissors

概要

LaravelのToy problemとして、簡単なじゃんけんのアプリケーションを作る。

  • 初期画面にRock/Paper/Scissorsの3つのラジオボタンと”Match!”ボタンを表示
  • ユーザーがラジオボタンのいずれかを選択して”Match!”ボタンを押すと、コンピューター側の手をランダムに発生させて勝敗比較
  • ユーザー/コンピューターの名前と手、結果を表示に加えて再表示

ユーザー、コンピューターのオブジェクトを生成するPlayerクラスを作成する。

また、手の値のバリデーションは行っていない。

Playerクラス

ユーザー/コンピューターに関わらず、プレーヤーの名前と現在の手(Rock/Paper/Scissors)を保持し、勝ち負け・あいこの判定機能を備えるクラス。

クラスファイルはpublic下のサブディレクトリ―に置く

  • クラスファイルの配置はpublic/rock_paper_scissors/Player.php
  • コントローラーなどからアクセスする場合、public_path()を使う

クラスの仕様は以下の通り。

  • 名前空間を含むフルパスのクラス名はrock_paper_scissors\Player
  • このクラスからユーザーとコンピューターそれぞれのインスタンスを生成
  • Playerのプロパティーは名前($name)とじゃんけんの手($hand_number)
  • $hand_numberは0: rock、1: paper、2: scissorsに対応
  • $hand_numberは外部からpublicメソッドで設定
  • $hand_numberに対応した手の名称をクラス定数の配列として準備し、現在の手の名前を返すメソッドを準備
  • 自身が他のPlayerに対して勝っているか(wins)、あいこか(draws)を判定するメソッドをそれぞれ準備

ルーティング

ルーティングはGETメソッドとPOSTメソッドに対応して2つ。

コントローラー

コントローラーのアクションは、GETに対する初期ページへの遷移と、POSTに対する処理・遷移の2つ。

ビュー

GETの場合はフォームだけ表示し、POSTでじゃんけんを実行したときには結果も表示する。

実行結果

初期表示

Rock-Paper-Scissors

  

 

結果表示

Rock-Paper-Scissors

  


User

  1. Name: USER
  2. Hand: Rock

Computer

  1. Name: COM
  2. Hand: Paper

Result

Computer won

 

PHP – 名前空間~namespace

概要

PHPの名前空間(namespace)は、Javaのパッケージのようにコード群をカプセル化し、異なる名前空間の間での名前の衝突を避ける役割を持つ。

namespace 名前空間名;

  • namespaceが記述された以降のコードはその名前空間に属する
  • 同じ名前空間内では、クラス名などはそのまま記述
  • 異なる名前空間のクラスなどを用いるときは、絶対パスを使うかuse文で名前空間を指定する(このuse文はトレイトuseとは異なる)

クラスの例

以下の例は、異なる名前空間のクラスを利用する場合。

  • 名前空間Bでクラス名MyClassだけを記述すると、名前空間BMyClassが使われる
  • 絶対パス\A\MyClassと記述すると、名前空間AMyClassが使われる
  • use \A\MyClassを記述すると、MyClassと記述したときに名前空間AMyClassが使われる(as ...でエイリアスも指定できる)

関数の場合

以下の例は、異なる名前空間の関数を利用する場合。

  • 名前空間Bで関数名funcだけを記述すると、名前空間Bfuncが使われる
  • 絶対パス\A\funcと記述すると、名前空間Afuncが使われる
  • use function \A\funcを記述すると、funcと記述したときに名前空間Afuncが使われる(as ...でエイリアスも指定できる)

定数の場合

以下の例は、異なる名前空間の定数を利用する場合。

  • 名前空間Bで関数名CONSTANTだけを記述すると、名前空間BCONSTANTが使われる
  • 絶対パス\A\CONSTANTと記述すると、名前空間ACONSTANTが使われる
  • use const \A\CONSTANTを記述すると、CONSTANTと記述したときに名前空間ACONSTANTが使われる(as ...でエイリアスも指定できる)

変数は名前空間によらずグローバル

変数は、それが定義された名前空間によらずグローバルスコープになる。

外部ファイルに分ける場合

外部ファイルで名前空間を設定している場合、インクルードしたコードで明示的に名前空間を指定する。

以下の例では2つのPHPファイルを準備し、それぞれの名前空間を設定している。

namespace_a.php

namespace_b.php

そして別のファイルでこれらのファイルを読み込んで実行する。

インクルード後に名前空間なしでクラス名のみ指定すると、クラスが見つからずエラーになる。

絶対パスかuseを使えば名前空間に応じたクラスを指定できる。

名前空間の部分指定

名前空間をパスで設定した場合、useでその一部を指定することができる。

以下の例では、

  • 名前空間japan\aichiの中でMyClassAMyClassBを定義
  • 名前空間japan\osakaの中でMyClassを定義
  • use japan\aichiとすることで、japan\aichiaichiとして使えるようになる
    • japan\aichi\MyClassAaichi\MyClassA
    • japan\aichi\MyClassBaichi\MyClassB
  • use japan\osakaとすることで、japan\osakaosakaとして使えるようになる
    • japan\osaka\MyClassosaka\MyClass

 

PHP – クラス定数

クラスの中で、constキーワードで定数を定義できる。

  • クラス内でアクセスする場合はself::でアクセス
  • クラス外でアクセスする場合はクラス名::でアクセス(変数::でも可能)

self::クラス名::などをつけないと、警告が出たうえで定数名自体が文字列として解釈される。

定数なので値を再代入することはできない。

const定義の右辺に定義済みの定数、算術式を使うことができる。しかし関数は使用できない。

定数定義の際にアクセス修飾子を使えて、アクセス制限ができる。省略した場合はpublic

 

PHP – gettype()/is_* – 型の確認

概要

値が特定のプリミティブ型かどうか、何かのクラスのインスタンスかどうかを確認する方法。

  • gettype()は型の名前の文字列を返す
  • is_*はそれぞれの型に合致しているかどうかをチェック

クラス関係の確認についてはこちらを参照、

gettype()

gettype()は、引数で与えられた値の型を文字列として返す。以下の例のほか、resourceunknown typeが準備されている。

is_*() – 型の確認

is_*(値)で値の型が合致しているかをチェック。

  • is_bool
  • is_numeric, is_finite, is_infinite, is_nan
  • is_int/is_integer, is_long, is_float/is_double/is_real
  • is_string
  • is_array
  • is_object, is_subclass_of

 

PHP – クラスの確認

概要

  • instanceof:値のクラスをチェック
  • is_a():値のクラスをチェック
  • is_subclass_of():値の親クラスをチェック
  • class_uses():トレイトを使っているかどうかチェック

instanceof/is_a()

instanceof

インスタンス instanceof クラス等名

instanceofは、第1オペランドが第2オペランドのクラスに合致しているかどうかをチェックする演算子。第2オペランドにはクラス名などをそのまま記述する。is_a()関数と同じ機能。

以下の例の様に、instanceofは、

  • そのインスタンスのクラス、継承した親クラス、インプリメントしたインターフェイスに対して真となる
  • トレイトについてはuseしていても真とはならない

is_a()

is_a(インスタンス, 'クラス等名');

is_a()は第1引数のインスタンスが第2引数のクラスに合致しているかどうかチェックする。第2引数のクラス名は文字列として与える。

以下の例のように、親クラス、インターフェイス、トレイトに対する判定はinstanceofと同じ。

is_subclass_of()

is_subclass_of(インスタンス, 'クラス等名');

is_subclass_of()は、第1引数のインスタンスのクラスが第2引数のクラスを継承しているかどうかをチェックする。引数の渡し方はis_a()と同じ。

以下の例のように、

  • 引数のインスタンスのクラスそのものは偽
  • 継承した親クラスとインターフェースに対しては真
  • トレイトは偽

class_uses()

class_uses(インスタンス);

class_uses()は、引数インスタンスのクラスがuseしているトレイト連想配列として返す。連想配列のキー・値とも、トレイト名の文字列。

トレイトをuseしているかどうかをチェックするには、class_uses()の結果の連想配列に対して、in_array()array_key_exists()でトレイト名が含まれるかどうかをチェック。

親クラスでトレイトをuseしていても、子クラスのclass_uses()では捕捉されない。

method_exists()/property_exists()

method_exists(インスタンス, ’クラス等名’)
property_exists(インスタンス, ’クラス等名’)

method_exists()は、第1引数で指定したインスタンスのクラスに第2引数で指定したメソッドが定義されているかどうかをチェックする。同様に、property_exists()はプロパティーが定義されているかどうかをチェックする。

以下の例で、method_exists()について確認する。

  • 指定したメソッドが定義されていればtrue、定義されていなければfalse
  • 親クラスのメソッドでも存在する(true)と判定(publicprivateに関わらない)
  • トレイトのメソッドも存在すると判定
  • 親クラスでuseされたトレイトのメソッドは、子クラスでも存在すると判定

 

PHP – array_key_exists() – 配列のキーの存在確認

概要

array_key_exists()$keyが配列のキーとして存在するかどうかをチェックする。比較にあたって、常に型変換が自動で行われる(‘==’と等価)。型までのチェックはされない。

array_key_exists($key, 配列)

連想配列への適用例

以下は連想配列に対する実行例。文字列と数値が自動で変換されている。

配列への適用例

配列に対しても適用可能で、この場合はインデックスが存在するかどうかがチェックされる。このときも自動的に型が変換される。

 

PHP – in_array() – 配列の値の存在確認

概要

in_array()は、指定した$needleが配列($heystack)の要素として含まれるかどうかをチェックする。

in_array($needle, 配列, $strict=false)

  • デフォルトでは$strict=falseで、型変換を行って内容比較する
  • $strict=trueを指定すると、型の一致まで確認する

配列の要素の確認

以下の例ではデフォルトの$strict=falseとなっていて、文字列・数値の変換が自動的に行われている('=='と同じ効果)。

$strict=trueを指定すると、文字列と数値の違いも判定される('==='と同じ効果)。

連想配列の値の確認

in_array()で連想配列を指定すると、キー・値のうち指定した$needleが「値として含まれるか」チェックする。キーとして含まれていてもfalseになる。

デフォルトの$strict=falseでは型変換が自動的に行われる。

$strict=trueに指定すると、型の一致までチェックする。

注意点

  • in_array()は空の配列やnullに対してfalseを返す
  • nullに対しては警告が出される

 

PHP – トレイト – メソッドの汎化

概要

インターフェイスはクラスがメソッドを実装することを明示・保証するが、その実装はインプリメントしたクラスに託されている。

一方トレイトは、予めメソッドを具体に実装しておき、これを用いるクラス中でuse文によって導入される。

トレイトの使い方

定義

traitキーワードでトレイトを定義し、その中で具体のメソッドを定義する。

トレイトの実装

トレイトを導入するクラスで、useキーワードで導入するトレイトを宣言し、メソッドを呼び出す。

実装例

ベースになるコード

インターフェイスで例示したRPGキャラクターのコードを使う。

  • 基底クラスCharacterClass:名前を持ち武器攻撃のみできる
  • インターフェイスSpellcaster:呪文を唱えるメソッドspell()を宣言
  • Swordfighterクラス:CharacterClassを継承
  • Wizardクラス:CharacterClassを継承し、Spellcasterをインプリメント
  • Priestクラス:CharacterClassを継承し、Spellcasterをインプリメント

要件

  • SwordfighterPriestに、クリティカルアタックの機能を持たせる
  • クリティカルアタックはどのクラスにおいても共通の技

トレイトの追加

以下のトレイトを追加する。

トレイトの導入

SwardfighterクラスとPriestクラスでトレイトを導入する。

トレイトのメソッドの利用

クラスのインスタンスでトレイトのメソッドを呼び出す。

留意点

  • プロパティーも宣言・定義できる
  • トレイトを導入するクラスを意図した$thisを使える
  • インスタンスのクラスがトレイトを導入している場合、class_uses()メソッドで導入しているトレイト名を得られる

class_uses~実装しているトレイトの確認

たとえば上の実装例で、別のトレイトも加えてclass_uses()で内容を確認してみる。トレイト名をキー・値とする連想配列となっていることがわかる。

これまでの例で、各クラスのインスタンスを配列に入れて、クラスに応じた動作をさせる。

トレイトを実装しているかどうかのチェックは、class_uses()で導入しているトレイトの連想配列を得て、そのキーに対象となるトレイト名があるかどうかをarray_key_exists()でチェック。