クラスの基礎class
各クラスの定義は、
クラス名には、PHP の予約語
以外でラベルとして有効なあらゆる名前を使用することができます。
有効なクラス名は、先頭が文字あるいはアンダースコアで始まり、
その後に任意の数の文字/数字/アンダースコアが続くものです。
正規表現で表すと、
クラスの中には、 定数 や 変数 ("プロパティ" といいます) そして関数 ("メソッド" といいます) を含めることができます。 例1 簡単なクラス定義
<?php メソッドがオブジェクトのコンテキストからコールされる場合は、 疑似変数 $this が利用可能です。 $this は、呼び出し元オブジェクトの値です。 警告
static でないメソッドを static メソッドとしてコールすると、 Error がスローされます。 PHP 8.0.0 より前のバージョンでは、推奨されない警告が発生し、 $this が未定義になっていました。 例2 $this 疑似変数の例
<?php 上の例の PHP 7 での出力は、このようになります。 $this is defined (A) Deprecated: Non-static method A::foo() should not be called statically in %s on line 27 $this is not defined. Deprecated: Non-static method A::foo() should not be called statically in %s on line 20 $this is not defined. Deprecated: Non-static method B::bar() should not be called statically in %s on line 32 Deprecated: Non-static method A::foo() should not be called statically in %s on line 20 $this is not defined. 上の例の PHP 8 での出力は、このようになります。: $this is defined (A) Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27 Stack trace: #0 {main} thrown in %s on line 27 読み取り専用クラスPHP 8.2.0 以降では、 クラスに対して readonly を指定することができます。 クラスに対して readonly を指定すると、 宣言されている全ての プロパティに対して readonly を指定した ことになり、 かつ 動的なプロパティ の作成を禁止したことになります。 さらに、AllowDynamicProperties アトリビュートを指定しても動的なプロパティを作成できなくなります。 動的なプロパティを作成しようとすると、コンパイル時にエラーが発生します。
<?php
型を指定していないプロパティや、
static プロパティ に対しては
<?php
<?php readonly を指定したクラスは、 子クラスでも readonly を指定した場合にのみ 継承 できます。 new
あるクラスのインスタンスを生成するには、
クラス名を含む文字列を
例3 インスタンスを作成する
<?php
クラスのコンテキストにおいては、
作成済みのクラスのインスタンスを新たな変数に代入する場合、新しい変数は、 代入されたオブジェクトと同じインスタンスにアクセスします。 この動作は、インスタンスを関数に渡す場合も同様です。 作成済みのオブジェクトのコピーは、その クローンを作成 することにより作成可能です。 例4 オブジェクトの代入
<?php 上の例の出力は以下となります。 NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" }
PHP 8.0.0 以降では、
例5 任意の式を使ってインスタンスを生成する
以下の例では、
クラス名を生成する有効な任意の式を複数示します。
関数呼び出し、文字列連結、そして
<?php 上の例の PHP 8 での出力は、このようになります。: object(ClassA)#1 (0) { } object(ClassB)#1 (0) { } object(ClassC)#1 (0) { } object(ClassD)#1 (0) { } 複数のやり方で、オブジェクトのインスタンスを作ることが出来ます: 例6 新しいオブジェクトの作成
<?php 上の例の出力は以下となります。 bool(true) bool(true) bool(true) 新しく作成したオブジェクトのメンバーに、作成したその式の中でもアクセスすることができます。 例7 新しく作成したオブジェクトのメンバーへのアクセス
<?php 上の例の出力は、 たとえば以下のようになります。 2016
プロパティとメソッドクラスのプロパティとメソッドは、それぞれ別の "名前空間" に存在するので、 同じ名前のプロパティとメソッドを共存させることもできます。 プロパティを参照する場合もメソッドを参照する場合も書きかたは同じです。 それがプロパティへのアクセスなのかメソッドの呼び出しなのかは、そのコンテキストによって決まります。 つまり、変数にアクセスしようとしているのか関数を呼び出そうとしているのかの違いです。 例8 プロパティへのアクセスとメソッドの呼び出し
<?php 上の例の出力は以下となります。 property method これはつまり、プロパティに 無名関数 を代入した場合に、その関数は直接呼び出せないということです。 その場合は、たとえば事前にプロパティを変数に代入しておく必要があります。 括弧で囲むと、プロパティを直接呼び出すこともできます。 例9 プロパティに格納した無名関数の呼び出し
<?php 上の例の出力は以下となります。 42 extends
クラスは、宣言部に 継承された定数やメソッド、プロパティをオーバーライド(上書き)するには、 親クラスで定義されているのと同じ名前でそれを再宣言します。 しかし、親クラスでそのメソッドや定数が final として定義されている場合はオーバーライドできません。 オーバーライドされた元のメソッドやstaticプロパティにアクセスするには、 parent:: で参照します。
例10 簡単なクラスの継承
<?php 上の例の出力は以下となります。 Extending class a default value シグネチャの互換性に関するルール
メソッドをオーバーライドするときは、
子クラスのシグネチャが親クラスのそれと互換性がなければいけません。
互換性が壊れた場合、致命的なエラーが発生します。
PHP 8.0.0 より前のバージョンでは、
互換性が壊れた場合に、 例11 互換性がある子クラスのメソッド
<?php 上の例の出力は以下となります。 Valid Valid 次の例は、引数を削除した子クラスのメソッドや、 オプションの引数を必須にしたりすることが、親クラスのメソッドと互換性がなくなることを示しています。 例12 子クラスのメソッドで引数を削除すると致命的なエラーになる
<?php 上の例の PHP 8 での出力は、たとえば以下のようになります。: Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13 例13 子クラスのメソッドで、オプションの引数を必須にすると致命的なエラーになる
<?php 上の例の PHP 8 での出力は、たとえば以下のようになります。: Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13 警告
メソッドの引数の名前を子クラスで変更しても、 シグネチャ上は非互換になりません。 しかし、こうしてしまうと 名前付き引数 を使った時に実行時エラーになるので、おすすめできません。 例14 子クラスで引数の名前を変更し、かつ名前付き引数を使うとエラーになる
<?php 上の例の出力は、 たとえば以下のようになります。 Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14 Stack trace: #0 {main} thrown in /in/XaaeN on line 14 ::class
例15 クラス名の解決
<?php 上の例の出力は以下となります。 NS\ClassName
PHP 8.0.0 以降では、
例17 オブジェクトの名前解決
<?php 上の例の出力は以下となります。 NS\ClassName nullsafe メソッドとプロパティ
PHP 8.0.0 以降では、プロパティやメソッドは
"nullsafe" 演算子 この演算子の働きは、 オブジェクトにアクセスするたびに is_null でラップするコードに似ています。 しかし、よりコンパクトです。
例18 nullsafe 演算子
<?php
|