VS Codeでコードを書きながら、PHPのクラスと名前空間を概観しよう:.NET開発者のためのPHPアプリお手軽開発入門(1/3 ページ)
VS Codeでコードを書きながら、PHPにおけるクラスや名前空間の基礎、C#とは異なるポイントなどについて見ていこう。
前回は、文字列、制御構造、関数など、PHPコードを書く上で知っておきたい必須の基礎知識を紹介した。今回は、クラスと名前空間について見ていこう。なお、前回同様、今回もVisual Studio Code(以下、VS Code)でコードを記述して、Code Runner拡張機能でそれを実行することで、簡単にその内容を把握できるはずだ。
クラスの定義
PHPでもクラスの定義にはclassキーワードを使用する。以下にクラスを定義して、そのクラスを利用する例を示す。コード中で使用しているPHP_EOLはPHPで事前定義されている定数で、そのコードを実行するプラットフォームにおける行末文字を表すものだ。ここではclass.phpファイルに以下の内容を記述した(本稿の最後でクラス定義の部分を再利用してみよう)。
<?php
class Foo
{
public $name;
private $id;
static private $count = 0;
public function showProp()
{
echo "id: " . $this->id . ", name: " . $this->name . PHP_EOL;
}
static function showCount()
{
echo "number of instance(s): " . self::$count . PHP_EOL;
}
public function __construct($name = "no name")
{
$this->name = $name;
$this->id = self::$count;
self::$count++;
}
}
$f = new Foo("foo");
$f->showProp();
Foo::showCount();
$b = new Foo("bar");
$b->showProp();
Foo::showCount();
上に示したFooクラスには以下が定義されている。
- publicなプロパティ:$name
- privateなプロパティ:$_id
- 静的(static)なプロパティ:$count
- メソッド(インスタンスメソッド):showProp
- クラスメソッド(静的メソッド):showCount
- コンストラクタ:__construct
PHPでは、C#でいうところのフィールドメンバのことをプロパティと呼ぶ。C#でいうところのプロパティ的なもの(ゲッタとセッタによるプロパティアクセス)を実装するには「マジックメソッド」という機構を使用するが、本稿では省略しよう。興味のある方は「PHPの『マジックメソッド』とは――『__set()』『__get()』『__invoke()』の使い方」を参照されたい。
さらにC#ではクラスと同じ名前のメソッドがコンストラクタとなったが、PHPではコンストラクタの名前は常に「__construct」となる点には注意しよう。このとき、変数名が「$」で始まったようにPHPのプロパティ(フィールド)は「$」で始まる。
また、PHPでは以下に示すアクセス権がある。
- public:どこからでもアクセス可能
- protected:そのメンバを定義しているクラス、その子クラスと親クラスからのみアクセス可能
- private:そのメンバを定義しているクラスからのみアクセス可能
privateメンバの名前はアンダースコアで始めることもあるが、コーディングスタイルガイドであるPSR-2(PSRはPHP Standard Recommendationの略)およびその後継として現在ドラフト段階にあるPSR-12では、「protectedメンバまたはprivateメンバであることを示すために1個のアンダースコアを前置きしてはいけない」(意訳)とされている。
プロパティ(フィールドメンバ)の定義には、以前のバージョンとの互換性を考慮してvarキーワードも使用できるが、この場合、アクセス権はpublicとなる。メソッドの定義時にアクセス権を指定しなかった場合にもpublicとなる。
クラスのインスタンス生成にnewを使うのはC#と同様だ。作成したインスタンスや、クラスのメンバにアクセスするには以下のようにする。
- オブジェクトが持つメンバ:アロー演算子(->演算子)を使用する
- クラスが持つメンバ(静的メンバ):スコープ定義演算子(::)にクラス名やselfなどを前置き
インスタンスメンバかクラスメンバかで、アクセスに使用する演算子が異なることには注意しよう。また、「$this->id」などとしているように、「$」はインスタンス自身を参照する疑似変数「$this」に付くだけで->演算子の後には不要な点にも注意。
上のコードではメソッド内でクラスメンバにアクセスするのに「self::$count」という記述をしているが、この「self」は「現在のクラスに対する静的参照」を意味する。クラス定義の後のコードでは「Foo::showCount()」のように、スコープ定義演算子の前にクラス名を前置きして静的メソッドを呼び出している。::演算子の前にはクラス名とself以外にも、parentとstaticを前置きできる。これらの詳細については、PHPのドキュメント「スコープ定義演算子 (::)」や「遅延静的束縛 (Late Static Bindings)」も参照されたい。
上のコードをVS CodeのCode Runner拡張機能で実行したところを以下に示す。
各インスタンスのメンバ($nameプロパティ)と、クラスが持つ静的プロパティ(Foo::$count)がきちんと表示されていることが分かる。
次にクラスの継承について見てみよう。
Copyright© Digital Advantage Corp. All Rights Reserved.