1. はじめに
PHP 5 以降、オブジェクト モデルは完全に書き直され、パフォーマンスが向上し、より多くの機能が追加されました。これは PHP 4 以来の最大の変更です。 PHP 5 には完全なオブジェクト モデルがあります。
PHP 5 の新機能には、アクセス制御、抽象および最終クラスとメソッド、追加のマジック メソッド、インターフェイス、オブジェクトのコピー、型制約が含まれます。
PHP はオブジェクトを参照やハンドルと同じように扱います。つまり、各変数はオブジェクト全体のコピーではなく、オブジェクトへの参照を保持します。
2. 基本概念
1.class
各クラスの定義はキーワード class で始まり、その後にクラス名が続き、その後にクラスの属性とメソッドの定義を含む中かっこが続きます。 。
クラス名には、PHP の予約語ではない任意の正当なタグを使用できます。有効なクラス名は文字またはアンダースコアで始まり、その後に複数の文字、数字、またはアンダースコアが続きます。正規表現で表現します: [a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*。
クラスには、独自の定数、変数 (「プロパティ」と呼ばれる)、および関数 (「メソッド」と呼ばれる) を含めることができます。
例 #1 単純なクラス定義
<?php class SimpleClass { //声明属性 public $var = '1'; //声明方法 public function displayVar(){ echo $this->var; } } ?>
クラス定義内でメソッドが呼び出されるとき、利用可能な疑似変数 $this があります。 $this は呼び出し元オブジェクトへの参照です (通常はメソッドが属するオブジェクトですが、2 番目のオブジェクトから静的に呼び出された場合は別のオブジェクトになる可能性があります)。
例 #2 $this 疑似変数の例
<?php class A { function foo() { if(isset($this)){ echo '$this is defined ('; echo get_class($this); echo ')<br>'; }else{ echo '$this is not defined.<br>'; } } } class B { function bar() { //如果开启了E_STRICT这一行会有警告提示 A::foo(); } } $a = new A(); $a -> foo(); //如果开启了E_STRICT这一行会有警告提示 A::foo(); $b = new B(); $b -> bar(); //如果开启了E_STRICT这一行会有警告提示 B::bar(); ?>
出力結果:
$this は定義されています (A)
$this は定義されていません。
$this は定義されています (B)
$this は定義されていません。
2.new
クラスのインスタンスを作成するには、new キーワードを使用する必要があります。新しいオブジェクトには、オブジェクトがコンストラクターを定義し、エラーで例外がスローされない限り、作成時に常に値が割り当てられます。クラスはインスタンス化される前に定義する必要があります (場合によってはこれが必要です)。
new の後にクラス名を含む文字列が続く場合、クラスのインスタンスが作成されます。クラスが名前空間に属している場合は、その完全名を使用する必要があります。
例 #3 インスタンスの作成
<?php $instance = new SimpleClass(); //也可以这样做: $className = "Foo"; $instance = new $className(); //Foo() ?>
クラス定義内で、新しい self と新しいparentを使用して新しいオブジェクトを作成できます。
オブジェクトの既に作成されたインスタンスを新しい変数に割り当てると、新しい変数はオブジェクトに割り当てられた場合と同じインスタンスにアクセスします。この動作は、インスタンスを関数に渡すときと同じです。クローン作成を使用して、すでに作成されたオブジェクトの新しいインスタンスを作成できます。
例 #4 オブジェクトの割り当て
include_once('class1.php'); $instance = new SimpleClass(); $assigned = $instance; $reference = & $instance; $instance -> var = '$assigned will have this value'; $instance = null; //$instance和$reference变成null var_dump($instance); var_dump($reference); var_dump($assigned);
出力結果は次のようになります:
NULL
NULL
object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value"
PHP 5.3.0 では、オブジェクトのインスタンスを作成する 2 つの新しいメソッドが導入されました:
c
lass Test { static public function getNew() { return new static; } } class Child extends Test {} $obj1 = new Test(); $obj2 = new $obj1; var_dump($obj1 !== $obj2); $obj3 = Test::getNew(); var_dump($obj3 instanceof Test); $obj4 = Child::getNew(); var_dump($obj4 instanceof Child);
出力結果:
bool(true)
bool(true)
bool(true)
3。 extends
クラスは、宣言内で extends キーワードを使用して、別のクラスのメソッドとプロパティを継承できます。 PHP は多重継承をサポートしていません。クラスは 1 つの基本クラス (Java のような単一継承) のみを継承します。
継承されたメソッドとプロパティは、同じ名前で再宣言することでオーバーライドできます。ただし、親クラスがメソッドを定義するときに Final を使用する場合、そのメソッドをオーバーライドすることはできません。オーバーライドされたメソッドまたはプロパティには、parent:: を通じてアクセスできます。
メソッドをオーバーライドするときは、パラメーターに一貫性がある必要があります。一貫性がない場合、PHP は E_STRICT レベルのエラー メッセージを発行します。例外はコンストラクターで、オーバーライド時に異なるパラメーターを取ることができます。
例 #6 単純なクラスの継承:
class ExtendClass extends SimpleClass { //重写父类的方法 function displayVar() { echo "Extending class<br>"; parent::displayVar(); } } $extended = new ExtendClass(); $extended -> displayVar();
出力結果:
Extending class
1
4.::class
PHP 5.5 以降、キーワード class はクラス名の解決にも使用できます。 ClassName::class を使用すると、クラス ClassName の完全修飾名を含む文字列を取得できます。これは、名前空間を使用するクラスに特に役立ちます。
例7 クラス名の分析
namespace NS{ class ClassName{} echo ClassName::class; }
出力結果:
NSClassName