PHPオブジェクト向け
13825 ワード
概要
PHPは、オブジェクト全体のコピーではなく、各変数がオブジェクトのリファレンスを保持するリファレンスとハンドルと同じ方法で扱われます.
基本概念
クラスの定義:
クラスのインスタンス化:
出力:
継承
PHPは多重継承をサポートしておらず、1つのクラスは1つのベースクラスしか継承できません.継承されたメソッドとプロパティは、同じ名前で上書きされることを再宣言できます.ただし、親定義メソッドでfinalが使用されている場合は、このメソッドは上書きできません.parent::を使用して、上書きされたメソッドまたはプロパティにアクセスできます.オーバーライド方法の場合、パラメータは一致しなければならない.そうしないとPHPはE_を発行する.STRICTレベルのエラーメッセージ.しかし、コンストラクション関数は例外であり、コンストラクション関数はオーバーライド時に異なるパラメータを使用することができる.
::class
PHP 5.5より,キーワードclassはクラス名の解析にも利用できる.ClassName::classを使用すると、クラスClassNameの完全修飾名を含む文字列を取得できます.これは、ネーミングスペースを使用したクラスに特に役立ちます.
出力:
ツールバーの
プロパティの変数は初期化できますが、初期化の値は定数でなければなりません.ここでの定数は、実行時の情報に依存せずにPHPスクリプトがコンパイルフェーズでその値を得ることができることを意味します.
PHP 5は、public、protected、privateのいずれかではなくvarを直接使用して属性を宣言する場合、publicとみなされます.
クラスのメンバーメソッドでは、->(オブジェクト演算子):$this->property(propertyがこの属性名)という方法で非静的属性にアクセスできます.静的属性は::(二重コロン):self::$propertyでアクセスします.
クラス定数
クラス内で常に一定の値を定数として定義できます.定数を定義して使用するときに$記号を使用する必要はありません.定数の値は定数でなければなりません.変数、クラス属性、数学演算の結果、または関数呼び出しではありません.インタフェース(interface)で定数を定義することもできます.
PHP 5.3.より0から、クラスを1つの変数で動的に呼び出すことができます.ただし、この変数の値は、self、parent、staticなどのキーワードではありません.
コンストラクション関数とコンストラクション関数
コンストラクタ
子クラスでコンストラクション関数が定義されている場合、親クラスのコンストラクション関数は暗黙的に呼び出されません.親クラスのコンストラクション関数を実行するには、サブクラスのコンストラクション関数でparent:_を呼び出す必要があります.construct().サブクラスがコンストラクション関数を定義していない場合は、privateとして定義されていない場合は、通常のクラスメソッドのように親から継承されます.
後方互換性を実現するために、PHP 5がクラスに見つからない場合_construct()関数であり、親から1つも継承されていない場合は、クラスと同じ名前の関数である旧式の構造関数を探してみます.したがって、互換性の問題が唯一発生するのは、クラスに__という名前が1つあることです.construct()の方法が他の用途に用いられる場合.他の方法とは異なり、construct()は親に_されます.construct()が異なるパラメータを持つ方法で上書きする場合、PHPはE_を生成しません.STRICTエラーメッセージ.PHP 5.3.より3から,ネーミング空間ではクラス名と同名のメソッドは構築関数として扱われなくなる.この変更は、ネーミングスペースにないクラスには影響しません.
こうぞうかんすう
PHP 5は、C++のような他のオブジェクト向け言語に類似した構造関数の概念を導入している.構造関数は、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されると実行されます.
コンストラクション関数と同様に、親クラスのコンストラクション関数はエンジンによって暗黙的に呼び出されません.親クラスの構造関数を実行するには、サブクラスの構造関数体でparent:_を明示的に呼び出す必要があります.destruct().また、コンストラクション関数と同様に、サブクラスは、コンストラクション関数を定義していない場合、親クラスを継承します.構造関数はexit()を使用してスクリプトの実行を終了しても呼び出されます.構造関数でexit()を呼び出すと、残りのクローズ操作の実行が中止されます.
スクリプトの終了時に呼び出される構造関数に例外を投げ出そうとすると、致命的なエラーが発生します.
アクセス制御
属性またはメソッドへのアクセス制御、前にキーワードpublic(共通)、protected(保護)またはprivateを追加することによって(プライベート)を使用して実装されます.パブリックとして定義されたクラスメンバーは、任意の場所でアクセスできます.保護されたクラスメンバーとして定義されている場合は、その子および親にアクセスできます.プライベートとして定義されているクラスメンバーは、その定義されているクラスアクセスのみになります.クラス属性は、パブリック、保護され、プライベートの1つとして定義する必要があります.varで定義されている場合は、パブリックとみなされますあります.クラス内のメソッドは、共有、プライベート、または保護として定義できます.これらのキーワードが設定されていない場合、このメソッドはデフォルトで公開されます.
その他のオブジェクトへのアクセス制御
同じクラスのオブジェクトは、同じインスタンスでなくても、互いに相手のプライベートおよび保護されたメンバーにアクセスできます.これは、これらのオブジェクトの内部で具体的に実装される詳細が既知であるためである.
出力:
オブジェクトの継承
自動ロードを使用しない限り、クラスは使用前に定義されなければなりません.クラスが別のクラスに拡張されている場合は、親クラスは子クラスの前に宣言する必要があります.このルールは、クラスが他のクラスとインタフェースを継承する場合に適用されます.
範囲解析オペレータ(:)
範囲解析オペレータ(Paamayim Nekudotayimとも呼ばれる)またはより簡単には、静的メンバー、クラス定数、クラス内の属性およびメソッドを上書きするために使用できる一対のコロンです.
クラスの外部での使用:オペレータオペレータ
クラス定義の内部で使用:
サブクラスが親のメソッドを上書きする場合、PHPは親のメソッドを呼び出すことはありません.親クラスを呼び出す方法は、子クラスによって異なります.この機構は構造関数と構造関数,再負荷およびマジック法にも作用する.
Staticキー
クラスのプロパティまたはメソッドが静的であることを宣言すると、クラスをインスタンス化せずに直接アクセスできます.静的プロパティは、クラスがインスタンス化されたオブジェクトからアクセスできません(静的メソッドは可能です).
静的メソッドはオブジェクトを介して呼び出す必要がないため、擬似変数$thisは静的メソッドでは使用できません.静的プロパティは、->オペレータを使用してオブジェクトにアクセスできません.静的に非静的メソッドを呼び出すとE_STRICTレベルのエラー.
抽象クラス
PHP 5は抽象クラスと抽象メソッドをサポートする.抽象として定義されたクラスはインスタンス化できません.いずれのクラスも、少なくとも1つのメソッドが抽象として宣言されている場合は、このクラスを抽象として宣言する必要があります.抽象として定義されるメソッドは、呼び出し方法(パラメータ)を宣言するだけで、その具体的な機能実装を定義することはできません.抽象クラスを継承する場合、子クラスは親クラスのすべての抽象メソッドを定義する必要があります.また、これらのメソッドのアクセス制御は親クラスと同じでなければなりません.(または、より緩やかな)メソッドの呼び出し方法は一致しなければならない.すなわち、タイプと必要なパラメータの数が一致しなければならない.たとえば、サブクラスはオプションのパラメータを定義しているが、親抽象メソッドの宣言にない場合、両者の宣言は衝突しない.これはPHP 5.4からのコンストラクション関数にも適用される.PHP 5.4までのコンストラクション関数宣言は異なる場合がある.
出力:
出力:
オブジェクトインタフェース
インタフェース(interface)を使用すると、クラスで実装する必要があるメソッドを指定できますが、これらのメソッドの具体的な内容を定義する必要はありません.インタフェースは、標準的なクラスを定義するようにinterfaceキーワードで定義されますが、すべてのメソッドを定義するのは空です.インタフェースで定義されているすべてのメソッドは共通でなければなりません.これはインタフェースの特性です.
実装(implements)
インタフェースを実装するには、implementsオペレータを使用します.クラスでは、インタフェースで定義されたすべてのメソッドを実装する必要があります.そうしないと、致命的なエラーが表示されます.クラスは、複数のインタフェースを実装し、複数のインタフェースの名前をカンマで区切ることができます.
複数のインタフェースを実装する場合、インタフェースのメソッドに重複名を付けることはできません.インタフェースはextendsオペレータを使用することで継承することもできます.クラスがインタフェースを実装するには、インタフェースで定義された方法と完全に一致する方法を使用する必要があります.致命的なエラーが発生します.
定数
インタフェースで定数を定義することもできます.インタフェース定数とクラス定数の使用はまったく同じですが、クラスまたはサブインタフェースで上書きすることはできません.
じゅうか
PHPが提供する「オーバーロード」(overloading)とは、クラス属性とメソッドを動的に「作成」することを意味します.マジックメソッド(magic methods)によって実現されます.すべてのオーバーロードメソッドはpublicとして宣言する必要があります.
これらのマジックメソッドのパラメータは参照によって伝達できません.
PHPの「リロード」は、他のほとんどのオブジェクト向け言語とは異なります.従来のリロードは、同じ名前のクラスメソッドを複数提供するために使用されていますが、各メソッドのパラメータタイプと個数は異なります.
オブジェクトの遍歴
PHP 5は、例えばforeach文などのセルリストを介してオブジェクトを定義する方法を提供する.既定では、すべての可視アトリビュートがループに使用されます.
PHPは、オブジェクト全体のコピーではなく、各変数がオブジェクトのリファレンスを保持するリファレンスとハンドルと同じ方法で扱われます.
基本概念
クラスの定義:
var;
}
}
?>
クラスのインスタンス化:
var = '$assigned will have this value';
$instance = null; // $instance and $reference become 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は多重継承をサポートしておらず、1つのクラスは1つのベースクラスしか継承できません.継承されたメソッドとプロパティは、同じ名前で上書きされることを再宣言できます.ただし、親定義メソッドでfinalが使用されている場合は、このメソッドは上書きできません.parent::を使用して、上書きされたメソッドまたはプロパティにアクセスできます.オーバーライド方法の場合、パラメータは一致しなければならない.そうしないとPHPはE_を発行する.STRICTレベルのエラーメッセージ.しかし、コンストラクション関数は例外であり、コンストラクション関数はオーバーライド時に異なるパラメータを使用することができる.
::class
PHP 5.5より,キーワードclassはクラス名の解析にも利用できる.ClassName::classを使用すると、クラスClassNameの完全修飾名を含む文字列を取得できます.これは、ネーミングスペースを使用したクラスに特に役立ちます.
出力:
NS\ClassName
ツールバーの
プロパティの変数は初期化できますが、初期化の値は定数でなければなりません.ここでの定数は、実行時の情報に依存せずにPHPスクリプトがコンパイルフェーズでその値を得ることができることを意味します.
PHP 5は、public、protected、privateのいずれかではなくvarを直接使用して属性を宣言する場合、publicとみなされます.
クラスのメンバーメソッドでは、->(オブジェクト演算子):$this->property(propertyがこの属性名)という方法で非静的属性にアクセスできます.静的属性は::(二重コロン):self::$propertyでアクセスします.
クラス定数
クラス内で常に一定の値を定数として定義できます.定数を定義して使用するときに$記号を使用する必要はありません.定数の値は定数でなければなりません.変数、クラス属性、数学演算の結果、または関数呼び出しではありません.インタフェース(interface)で定数を定義することもできます.
PHP 5.3.より0から、クラスを1つの変数で動的に呼び出すことができます.ただし、この変数の値は、self、parent、staticなどのキーワードではありません.
";
}
}
echo MyClass::constant . "
";
$classname = "MyClass";
echo $classname::constant . "
"; // 5.3.0
$class = new MyClass();
$class-?>showConstant();
echo $class::constant."
"; // PHP 5.3.0
?>
コンストラクション関数とコンストラクション関数
コンストラクタ
void __construct ([ mixed $args [, $... ]] )
子クラスでコンストラクション関数が定義されている場合、親クラスのコンストラクション関数は暗黙的に呼び出されません.親クラスのコンストラクション関数を実行するには、サブクラスのコンストラクション関数でparent:_を呼び出す必要があります.construct().サブクラスがコンストラクション関数を定義していない場合は、privateとして定義されていない場合は、通常のクラスメソッドのように親から継承されます.
";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor
";
}
}
class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
??>
後方互換性を実現するために、PHP 5がクラスに見つからない場合_construct()関数であり、親から1つも継承されていない場合は、クラスと同じ名前の関数である旧式の構造関数を探してみます.したがって、互換性の問題が唯一発生するのは、クラスに__という名前が1つあることです.construct()の方法が他の用途に用いられる場合.他の方法とは異なり、construct()は親に_されます.construct()が異なるパラメータを持つ方法で上書きする場合、PHPはE_を生成しません.STRICTエラーメッセージ.PHP 5.3.より3から,ネーミング空間ではクラス名と同名のメソッドは構築関数として扱われなくなる.この変更は、ネーミングスペースにないクラスには影響しません.
こうぞうかんすう
void __destruct ( void )
PHP 5は、C++のような他のオブジェクト向け言語に類似した構造関数の概念を導入している.構造関数は、オブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されると実行されます.
";
$this-?>name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "
";
}
}
$obj = new MyDestructableClass();
?>
コンストラクション関数と同様に、親クラスのコンストラクション関数はエンジンによって暗黙的に呼び出されません.親クラスの構造関数を実行するには、サブクラスの構造関数体でparent:_を明示的に呼び出す必要があります.destruct().また、コンストラクション関数と同様に、サブクラスは、コンストラクション関数を定義していない場合、親クラスを継承します.構造関数はexit()を使用してスクリプトの実行を終了しても呼び出されます.構造関数でexit()を呼び出すと、残りのクローズ操作の実行が中止されます.
スクリプトの終了時に呼び出される構造関数に例外を投げ出そうとすると、致命的なエラーが発生します.
アクセス制御
属性またはメソッドへのアクセス制御、前にキーワードpublic(共通)、protected(保護)またはprivateを追加することによって(プライベート)を使用して実装されます.パブリックとして定義されたクラスメンバーは、任意の場所でアクセスできます.保護されたクラスメンバーとして定義されている場合は、その子および親にアクセスできます.プライベートとして定義されているクラスメンバーは、その定義されているクラスアクセスのみになります.クラス属性は、パブリック、保護され、プライベートの1つとして定義する必要があります.varで定義されている場合は、パブリックとみなされますあります.クラス内のメソッドは、共有、プライベート、または保護として定義できます.これらのキーワードが設定されていない場合、このメソッドはデフォルトで公開されます.
その他のオブジェクトへのアクセス制御
同じクラスのオブジェクトは、同じインスタンスでなくても、互いに相手のプライベートおよび保護されたメンバーにアクセスできます.これは、これらのオブジェクトの内部で具体的に実装される詳細が既知であるためである.
foo = $foo;
}
private function bar()
{
echo 'Accessed the private method.';
}
public function baz(Test $other)
{
// We can change the private property:
$other->foo = 'hello';
var_dump($other->foo);
// We can also call the private method:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
出力:
string(5) "hello"
Accessed the private method.
オブジェクトの継承
自動ロードを使用しない限り、クラスは使用前に定義されなければなりません.クラスが別のクラスに拡張されている場合は、親クラスは子クラスの前に宣言する必要があります.このルールは、クラスが他のクラスとインタフェースを継承する場合に適用されます.
printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP(); // Output: 'PHP is great'
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP(); // Output: 'PHP is great'
?>
範囲解析オペレータ(:)
範囲解析オペレータ(Paamayim Nekudotayimとも呼ばれる)またはより簡単には、静的メンバー、クラス定数、クラス内の属性およびメソッドを上書きするために使用できる一対のコロンです.
クラスの外部での使用:オペレータオペレータ
クラス定義の内部で使用:
self
,parent
およびstatic
この3つの特殊なキーワードは、クラス定義の内部で属性またはメソッドにアクセスするために使用されます.";
echo self::$my_static . "
";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // PHP 5.3.0
OtherClass::doubleColon();
??>
サブクラスが親のメソッドを上書きする場合、PHPは親のメソッドを呼び出すことはありません.親クラスを呼び出す方法は、子クラスによって異なります.この機構は構造関数と構造関数,再負荷およびマジック法にも作用する.
";
}
}
class OtherClass extends MyClass
{
//
public function myFunc()
{
//
parent::myFunc();
echo "OtherClass::myFunc()
";
}
}
$class = new OtherClass();
$class-?>myFunc();
?>
Staticキー
クラスのプロパティまたはメソッドが静的であることを宣言すると、クラスをインスタンス化せずに直接アクセスできます.静的プロパティは、クラスがインスタンス化されたオブジェクトからアクセスできません(静的メソッドは可能です).
静的メソッドはオブジェクトを介して呼び出す必要がないため、擬似変数$thisは静的メソッドでは使用できません.静的プロパティは、->オペレータを使用してオブジェクトにアクセスできません.静的に非静的メソッドを呼び出すとE_STRICTレベルのエラー.
抽象クラス
PHP 5は抽象クラスと抽象メソッドをサポートする.抽象として定義されたクラスはインスタンス化できません.いずれのクラスも、少なくとも1つのメソッドが抽象として宣言されている場合は、このクラスを抽象として宣言する必要があります.抽象として定義されるメソッドは、呼び出し方法(パラメータ)を宣言するだけで、その具体的な機能実装を定義することはできません.抽象クラスを継承する場合、子クラスは親クラスのすべての抽象メソッドを定義する必要があります.また、これらのメソッドのアクセス制御は親クラスと同じでなければなりません.(または、より緩やかな)メソッドの呼び出し方法は一致しなければならない.すなわち、タイプと必要なパラメータの数が一致しなければならない.たとえば、サブクラスはオプションのパラメータを定義しているが、親抽象メソッドの宣言にない場合、両者の宣言は衝突しない.これはPHP 5.4からのコンストラクション関数にも適用される.PHP 5.4までのコンストラクション関数宣言は異なる場合がある.
getValue() . "
";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."
";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."
";
?>
出力:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
prefixName("Pacman"), "
";
echo $class->prefixName("Pacwoman"), "
";
?>
出力:
Mr. Pacman
Mrs. Pacwoman
オブジェクトインタフェース
インタフェース(interface)を使用すると、クラスで実装する必要があるメソッドを指定できますが、これらのメソッドの具体的な内容を定義する必要はありません.インタフェースは、標準的なクラスを定義するようにinterfaceキーワードで定義されますが、すべてのメソッドを定義するのは空です.インタフェースで定義されているすべてのメソッドは共通でなければなりません.これはインタフェースの特性です.
実装(implements)
インタフェースを実装するには、implementsオペレータを使用します.クラスでは、インタフェースで定義されたすべてのメソッドを実装する必要があります.そうしないと、致命的なエラーが表示されます.クラスは、複数のインタフェースを実装し、複数のインタフェースの名前をカンマで区切ることができます.
複数のインタフェースを実装する場合、インタフェースのメソッドに重複名を付けることはできません.インタフェースはextendsオペレータを使用することで継承することもできます.クラスがインタフェースを実装するには、インタフェースで定義された方法と完全に一致する方法を使用する必要があります.致命的なエラーが発生します.
定数
インタフェースで定数を定義することもできます.インタフェース定数とクラス定数の使用はまったく同じですが、クラスまたはサブインタフェースで上書きすることはできません.
vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// , , getHtml():
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
じゅうか
PHPが提供する「オーバーロード」(overloading)とは、クラス属性とメソッドを動的に「作成」することを意味します.マジックメソッド(magic methods)によって実現されます.すべてのオーバーロードメソッドはpublicとして宣言する必要があります.
これらのマジックメソッドのパラメータは参照によって伝達できません.
PHPの「リロード」は、他のほとんどのオブジェクト向け言語とは異なります.従来のリロードは、同じ名前のクラスメソッドを複数提供するために使用されていますが、各メソッドのパラメータタイプと個数は異なります.
オブジェクトの遍歴
PHP 5は、例えばforeach文などのセルリストを介してオブジェクトを定義する方法を提供する.既定では、すべての可視アトリビュートがループに使用されます.