※この記事は「PHP5のクラスとオブジェクト」シリーズの補足・修正であり、PHP5のオブジェクトシステムの全体的な仕組みを紹介していますが、詳しくは紹介していない機能もあります。 「PHP5 のクラスとオブジェクト」を読んだ後にこの記事を読むことを強くお勧めします。
PHP5 によって開始されるオブジェクト システムは、誰もが最も楽しみにしているものであると考えられています。 PHP5 は Java2 のオブジェクト モデルを利用しており、比較的強力なオブジェクト指向プログラミング サポートを提供します。PHP を使用した OO の実装は簡単かつ自然になります。
オブジェクトの受け渡し
PHP5 は Zend Engine II を使用しており、オブジェクトは他の一般的な変数とは異なり、独立した構造のオブジェクト ストアに格納されます。 Zval に格納されます (PHP4 では、オブジェクトは一般変数と同様に Zval に格納されます)。オブジェクトの内容 (値) ではなく、オブジェクトのポインターのみが Zval に格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインターを保持し、この特定のオブジェクトが別の zval を介してポイントしていることをオブジェクト ストアに通知するだけです。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造体に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトは常に参照 (参照) によって渡されるように見えるため、PHP のオブジェクトはデフォルトで「参照」によって渡され、PHP4 のように & を使用して宣言する必要がなくなりました。
ガベージ コレクション メカニズム
一部の言語 (最も一般的には C) では、データ構造を作成するときに明示的にメモリ割り当てを要求する必要があります。メモリを割り当てたら、情報を変数に保存できます。同時に、マシンが他の変数用にメモリを解放し、メモリ不足を回避できるように、変数の使用が終了したらメモリを解放する必要もあります。
PHP は自動的にメモリを管理し、不要になったオブジェクトを消去できます。 PHP は、参照カウントと呼ばれる単純なガベージ コレクション メカニズムを使用します。各オブジェクトには参照カウンタが含まれており、オブジェクトに接続されている参照ごとにカウンタが 1 ずつ増加します。参照がリビング スペースを離れるか、NULL に設定されると、カウンターは 1 ずつ減らされます。オブジェクトの参照カウンタがゼロになると、PHP はそのオブジェクトを使用する必要がなくなったことを認識し、そのオブジェクトが占有しているメモリ領域を解放します。
例:
class Person{
}
function sendEmailTo(){
}
$haohappy = new Person( );
// 新しいオブジェクトを作成します: 参照カウント = 1
$haohappy2 = $haohappy;
// 参照によってコピーします: 参照カウント = 2
unset($haohappy) ;
// 参照の削除: 参照カウント = 1
sendEmailTo($haohappy2);
// オブジェクトを参照で渡す:
// 関数実行中:
// 参照カウント = 2
// 実行後:
// 参照カウント = 1
unset($haohappy2);
// 参照の削除: 参照カウント = 0 メモリ空間を自動的に解放します
?>
上記は PHP5 のメモリ管理の変更点ですが、あまり興味がないかもしれません。 PHP5 と PHP4 のオブジェクト モデルの具体的な違いを見てみましょう:
★ 新機能
★ 改善された機能
1) ★ プライベートおよび保護されたメンバー プライベートおよび保護されたクラスのメンバー (プロパティ、メソッド)
2) ★ 抽象クラスとメソッド 抽象クラスと抽象メソッド
3) ★ インターフェイス インターフェイス
4) ★ クラスタイプヒントのタイプ表示 =
5) ★ 最終的な最後のキーワード =
6) ★ オブジェクトの複製オブジェクトのコピー =
7) ★コンストラクターとデストラクター コンストラクターとデストラクター
8) ★ クラス定数 クラス定数 =
9) ★ 例外 例外処理
10) ★ 静的メンバー 静的クラス メンバー
11) ★__METHOD__ constant __METHOD__ constant =
12) ★ Reflection 反映機構
No. 10 を参照してください。この記事の最後にある「PHP5のクラスとオブジェクト」シリーズで詳しく紹介されているため、この記事では説明しません。 9 番目の例外処理と 12 番目の反映メカニズムは、比較的内容が濃いため、紙面の都合上、記事では紹介できません。近々発行される電子雑誌「PHP & More」の第 2 号にご注目ください。具体的に記事で紹介します。
次に、言語機能 4、5、6、8、11 を紹介します。
4) ★ Class Type Hints の型表示
ご存知のとおり、PHP は型付けが弱い言語です。変数を使用する前に定義する必要はなく、変数のデータ型を宣言する必要もありません。これはプログラミングに多くの利便性をもたらしますが、特に変数の型が変更された場合には、いくつかの隠れた危険ももたらします。 PHP5 では型命令が追加され、実行中にクラスメソッドのパラメータの型を自動的に決定できます。これは Java2 の RTTI に似ています。リフレクションと組み合わせることで、オブジェクトを非常に適切に制御できます。
interface Foo {
function a(Foo $foo);
interface Bar {
function b(Bar $bar);
}
class FooBar は Foo, Bar を実装します {
function a(Foo $foo) {
// ...
}
function b(Bar $bar) {
// ...
}
}
$a = new FooBar; = 新しい FooBar;
$a->a($b)
;
厳密に型指定された言語では、すべての変数の型がコンパイル時にチェックされますが、PHP では型ディレクティブを使用して実行時に型がチェックされます。クラス メソッド パラメーターの型が正しくない場合、「致命的なエラー: 引数 1 はインターフェイス Bar を実装する必要があります...」のようなエラー メッセージが報告されます。
次のコード:
function foo(ClassName $object) {
// ...
}
?>
は次と同等です:
function foo($object) {
if (!($object) instanceof ClassName )) {
die("引数 1 は ClassName のインスタンスである必要があります")
}
}
?>
<🎜; >
5) ★final ファイナルキーワード
final キーワードは PHP5 で新たに追加されたキーワードで、クラスやクラスメソッドの前に追加できます。 Final としてマークされたクラス メソッドは、サブクラスでオーバーライドできません。 「final」としてマークされたクラスは継承できず、そのクラス内のメソッドはデフォルトで「final」になります。
最終メソッド:
class Foo {
final function bar() {
// ...
}
}
?>
最終クラス:
final class Foo {
// クラス定義
}
//次の行は間違っています
// class Bork extends Foo {}
?>
6) ★ オブジェクトの複製 オブジェクトのコピー
メモリ管理セクションで前述したように、PHP5 ではデフォルトでオブジェクトが参照によって渡されます。 $object2=$object1 などのメソッドを使用してコピーされたオブジェクトは相互に関連しています。元のオブジェクトと同じ値を持つオブジェクトを本当にコピーする必要があり、ターゲット オブジェクトがソース オブジェクトに関連していないことを望む場合 (通常の変数のように値で渡されます)、 clone キーワードを使用する必要があります。コピー中にソース オブジェクトの一部を変更する場合は、クラスに __clone() 関数を定義して操作を追加できます。
//オブジェクトコピー
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id ;
}
/*
function __clone() {
$this->address = "新規ヨーク";
$this->id = self::$id ;
}
*/
}
$obj = new MyCloneable();
$obj->name = "Hello";
$obj->address = "テルアビブ";
print $obj->id
$obj_cloned = クローン $obj;
print $obj_cloned->id . "n";
print $obj_cloned-> >address . "n";
?>
上記のコードは同一のオブジェクトをコピーします。
その後、関数 __clone() のコメントを削除してプログラムを再実行してください。基本的には同じですが、いくつかのプロパティが変更されたオブジェクトがコピーされます。
8) ★ クラス定数 クラス定数
PHP5 では、const キーワードを使用してクラス定数を定義できます。
class Foo {
const constant = "定数";
}
echo "Foo::constant = " . Foo::constant . "n";
11) ★__METHOD__ 定数 __METHOD__ 定数
__METHOD__ は、クラスのメソッド名を表す、PHP5 の新しい「魔法の」定数です。
マジック定数は、値が変更できる PHP の事前定義定数です。PHP の他の既存のマジック定数には、__LINE__、__FILE__、__FUNCTION__、__CLASS__ などが含まれます。
class Foo {
function show() {
echo __METHOD__;
}
}
class Bar extends Foo {
}
Foo::show(); // Foo::show を出力します
Bar::show(); // __METHOD__ が
であるため、Foo::show を出力します// -time 評価トークン
function test() {
echo __METHOD__;
test(); // テスト
?> :ヴィフォト)