PHP5 のオブジェクトはより体系的かつ包括的に調整されており、現在の外観は Java に似ているかもしれません。このセクションでは、PHP5 の新しいオブジェクト モードに焦点を当て、いくつかの簡単な例を示します。このセクションを PHP5 への取り組みの新たな出発点にしてください。 :)
* コンストラクターとデストラクター
* オブジェクト参照
*オブジェクトのクローン
* オブジェクトのプライベート、パブリック、および保護モード
* インターフェース
* 抽象クラス
* __電話
* __set と __get
* 静的メンバー
コンストラクターとデストラクター
PHP4 では、関数がオブジェクトと同じ名前を持つ場合、その関数はオブジェクトのコンストラクターになります。PHP4 にはデストラクターの概念がありません。
PHP5 では、コンストラクターは一律 __construct という名前になり、デストラクターの概念が導入され、一律 __destruct という名前になります。
例 1: コンストラクターとデストラクター
クラス foo {
変数$x;
関数 __construct($x) {
$this->x = $x;
}
関数表示() {
print($this->x);
}
関数 __destruct() {
print("バイバイ");
}
}
$o1 = 新しい foo(4);
$o1->display();
?>
上記の例では、クラス foo の呼び出しを終了すると、そのデストラクターが呼び出され、上記の例では「bye bye」が出力されます。
オブジェクト参照により
関数またはメソッドに変数を渡すと、実際には変数のコピーが作成されます。つまり、参照を使用しない限り、関数またはメソッドに渡すものは変数のコピーになります。記号「&」は、コピーではなく参照を作成することを宣言するために使用されます。 PHP5ではオブジェクトは常に参照の形で存在し、オブジェクトへの代入演算も参照演算となります。
例 2: オブジェクト参照
クラス foo {
変数$x;
関数 setX($x) {
$this->x = $x;
}
関数 getX() {
$this->x を返します。
}
}
$o1 = 新しい foo;
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("なんと!");
?>
オブジェクトのクローン
上で述べたように、オブジェクトが常に参照の形式で呼び出される場合、オブジェクトのコピーを取得したい場合はどうすればよいでしょうか。 PHP5 では、オブジェクトのクローン作成という新しい機能が提供されており、その構文は __clone です。
例 3: オブジェクトのクローン作成
クラス foo {
変数$x;
関数 setX($x) {
$this->x = $x;
}
関数 getX() {
$this->x を返します。
}
}
$o1 = 新しい foo;
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5); if($o1->getX() != $o2->getX()) print(「コピーは独立しています」);
?>
オブジェクトのクローン作成メソッドは他の多くのアプリケーション言語に存在するため、その安定性について心配する必要はありません。 :)
オブジェクトのプライベート、パブリック、およびプロテクト モード
PHP4 では、オブジェクトのすべてのメソッドと変数はパブリックです。つまり、オブジェクトの外部で変数とメソッドを操作できます。 PHP5 では、このアクセス許可を制御するために、Public、Protected、Private という 3 つの新しいモードが導入されています。
パブリックモード(Public): オブジェクト外での操作制御を可能にします。
プライベート モード (プライベート): このオブジェクト内のメソッドのみが操作および制御を許可されます。
保護モード (Protected): このオブジェクトとその親オブジェクトが操作および制御できるようにします。
例 4: オブジェクトのプライベート、パブリック、および保護モード
クラス foo {
プライベート $x;
パブリック関数 public_foo() {
print("私は公開しています");
}
保護された関数 protected_foo() {
$this->private_foo(); //同じクラスにいるので、プライベート メソッドを呼び出すことができます。
print("私は守られています");
}
プライベート関数 private_foo() {
$this->x = 3;
print("私はプライベートです");
}
}
class foo2 extends foo {
パブリック関数display() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // この関数は基本クラスでは無効です。
}
$x = 新しい foo();
$x->public_foo();
//$x->protected_foo(); //無効な場合、クラスおよび派生クラスの外で保護されたメソッドを呼び出すことはできません
//$x->private_foo(); //無効なプライベート メソッドはクラス内でのみ使用できます $x2 = new foo2();
$x2->display();
?>
ヒント: オブジェクト内の変数は常にプライベート形式で存在します。オブジェクト内の変数を直接操作することは、オブジェクトのメソッドに渡して処理することをお勧めします。
インターフェース
ご存知のとおり、PHP4 のオブジェクトは継承をサポートしています。オブジェクトを別のオブジェクトの派生クラスにするには、「class foo extendsparent」のようなコードを使用して制御する必要があります。 PHP4 および PHP5 では、オブジェクトは 1 回のみ継承でき、多重継承はサポートされていません。ただし、PHP5 では、インターフェイスという新しい用語が生まれました。インターフェイスは、特定の処理コードを持たない特別なオブジェクトであり、その後、オブジェクトは「implement」キーワードで便利に使用できます。必要なインターフェイスが統合され、その後、特定の実行コードが追加されます。
例 5: インターフェース
インターフェース表示可能 {
関数ディスプレイ();
}
インターフェース印刷可能 {
関数 doprint();
、
displayable,printable {を実装します
。
関数表示() {
// コード
関数 doprint() {
// コード
}
}
?>
これは、コードの読みやすさと人気を向上させるのに非常に役立ちます。上記の例から、オブジェクト foo には、displayable と printable という 2 つのインターフェイスが含まれていることがわかります。 () メソッドと print() メソッドであれば、インターフェイス部分を理解するだけで、オブジェクトの内部動作を意識することなく簡単にオブジェクトを操作できます。
抽象クラス
抽象クラスはインスタンス化できません。
抽象クラスでは、他のクラスと同様に、変数とメソッドを定義できます。
抽象クラスは抽象メソッドを定義することもできます。抽象クラスのメソッドは実行されませんが、その派生クラスで実行される可能性があります。
例 6: 抽象クラス
抽象クラス foo {
保護された $x;
抽象関数 display();
関数 setX($x) {
$this->x = $x;
}
}
class foo2 extends foo {
関数表示() {
// コード
}
}
?>
__call
PHP5 オブジェクトには、オブジェクト内の他のメソッドを監視するために使用される新しい専用メソッド __call() があります。オブジェクトに存在しないメソッドを呼び出そうとすると、__call メソッドが自動的に呼び出されます。
例 7: __call
クラス foo {
function __call($name,$arguments) {
print("電話しましたか?私は $name です!");
}
$x = 新しい foo();
$x->doStuff();
$x->fancy_stuff();
?>
この特別なメソッドを使用すると、「オーバーロード」アクションを実装できるため、パラメーターを確認し、プライベート メソッドを呼び出して渡すことができます。
例 8: __call を使用して「オーバーロード」アクションを実装する
クラスマジック {
function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
プライベート関数 foo_for_int($x) {
print("ああ int!");
プライベート関数 foo_for_string($x) {
print("ああ、文字列だ!");
}
$x = 新しい Magic();
$x->foo(3);
$x->foo("3");
?>
__set と __get
これは優れたメソッドです。__set メソッドと __get メソッドを使用すると、オブジェクトに存在しない変数やメソッドを取得できます。
例 9: __set と __get
クラス foo {
関数 __set($name,$val) {
print("こんにちは、$name に $val を入れようとしました");
}
関数 __get($name) {
print("$name を要求しましたね");
}
}
$x = 新しい foo();
$x->バー = 3;
print($x->winky_winky);
?>
型の指示
PHP5 では、オブジェクトのメソッドで、そのパラメータが別のオブジェクトのインスタンスである必要があることを指定できます。
例 10: タイプの表示
クラス foo {
// コード ...
}
クラスバー{
パブリック関数 process_a_foo(foo $foo) {
// いくつかのコード
}
}
$b = 新しいバー();
$f = 新しい foo();
$b->process_a_foo($f);
?>
ご覧のとおり、パラメータの前にオブジェクトの名前を明示的に指定することができ、PHP5 はパラメータがオブジェクト インスタンスであることを認識します。
静的メンバ
静的メンバおよび静的メソッドは、オブジェクト指向プログラミング用語では「オブジェクトメソッド(クラスメソッド)」および「オブジェクト変数(クラス変数)」と呼ばれます。
「オブジェクト メソッド」は、オブジェクトがインスタンス化される前に呼び出すことができます。同様に、「オブジェクト変数」は、オブジェクトがインスタンス化される前に (オブジェクトの制御にオブジェクトのメソッドを使用せずに) 独立して制御できます。
例 11: オブジェクトのメソッドとオブジェクト変数
クラス計算機 {
静的パブリック $pi = 3.14151692;
静的パブリック関数 add($x,$y) {
$x + $y を返します。
}
}
$s = 電卓::$pi;
$result = 計算機::add(3,7);
print("$result");
?>
例外処理
例外処理は、プログラム エラーを処理するための理想的な方法として認識されています。この概念は Java および C++ で利用可能です。このアプリケーションが PHP5 に追加されたことを嬉しく思います。 「try」と「catch」を使用してプログラム エラーを制御してみることができます。
例 12: 例外処理
クラス foo {
関数除算($x,$y) {
if($y==0) throw new Exception(「ゼロで割ることはできません」);
$x/$y を返します。
}
}
$x = 新しい foo();
試す {
$x->除算(3,0);
} catch (例外 $e) {
echo $e->getMessage();
エコー「ん」
ん";
// ここには致命的な対策がいくつかあります
}
?>
上記の例では、中括弧内のステートメントを実行するために "try" を使用しました。エラーが発生した場合、コードは処理のためにエラーを "catch" 句に渡します。オブジェクトに対するエラーを処理すると、すべてのエラー情報を処理のためにオブジェクトに渡すことができるため、コード構造がより明確になります。
カスタム エラー処理
カスタム エラー処理コードを使用すると、プログラム内の事故を簡単に制御できます。独自のエラー制御クラスを例外クラスから派生する必要があるだけです。独自のエラー制御クラスには、コンストラクターと getMessage メソッドが必要です。以下にその例を示します。
例 13: カスタム エラー処理
class WeirdProblem extends Exception {
プライベート $data;
関数奇妙な問題($data) {
親::例外();
$this->data = $data;
}
関数 getMessage() {
return $this->data . " 奇妙な例外が発生しました!";
}
}
?>
これで、「throw new WeirdProblem($foo)」を使用してエラー ハンドラーをスローできるようになりました。「try」コード ブロックでエラーが発生した場合、PHP5 は自動的にエラーを「catch」部分に渡して処理します。
ネームスペース
ネームスペースは、クラスのグループ化または関数のグループ化に役立ちます。関連するクラスや関数をグループ化して、後で簡単に呼び出すことができます。
例 14: 名前空間
名前空間 Math {
クラス コンプレックス {
//...コード...
関数 __construct() {
print("ねえ");
}
}
$m = 新しい Math::Complex();
?>
実際のアプリケーションでは、異なる処理を行うために同じ名前の 2 つ以上のオブジェクトを宣言する必要がある場合があります (ただし、インターフェイスは異なる名前空間に置く必要があります)。同じ)。