ホームページ >バックエンド開発 >PHPチュートリアル >PHP5 オブジェクト システム_PHP チュートリアル
※この記事は「PHP5のクラスとオブジェクト」シリーズの補足・修正であり、PHP5のオブジェクトシステムの全体的な仕組みを紹介していますが、詳しくは紹介していない機能もあります。 「PHP5 のクラスとオブジェクト」を読んだ後にこの記事を読むことを強くお勧めします。
PHP5 によって開始されたオブジェクト システムは、誰もが最も期待していると考えられています。 PHP5 は Java2 のオブジェクト モデルを利用しており、比較的強力なオブジェクト指向プログラミング サポートを提供します。PHP を使用した OO の実装は簡単かつ自然になります。
オブジェクト転送
PHP5 では、オブジェクトは他の一般変数のように Zval に保存されるのではなく、独立した構造のオブジェクト ストアに保存されます (PHP4 では、オブジェクトは一般変数と同様に Zval に保存されます)。ズヴァル)。オブジェクトの内容 (値) ではなく、オブジェクトのポインターのみが Zval に格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインターを保持し、この特定のオブジェクトが別の zval を介してポイントしていることをオブジェクト ストアに通知するだけです。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトは常に参照によって渡されるように見えるため、PHP のオブジェクトはデフォルトで「参照」によって渡され、PHP4 のように & を使用してオブジェクトを宣言する必要がなくなりました。
ガベージコレクションメカニズム
一部の言語 (最も一般的には C) では、データ構造を作成するときに明示的にメモリ割り当てを要求する必要があります。メモリを割り当てたら、情報を変数に保存できます。同時に、変数の使用が終了したときにメモリを解放する必要もあります。これにより、マシンは他の変数用にメモリを解放し、メモリ不足を避けることができます。
PHP は自動的にメモリを管理し、不要になったオブジェクトを消去できます。 PHP は、参照カウントと呼ばれる単純なガベージ コレクション メカニズムを使用します。各オブジェクトには参照カウンタが含まれており、オブジェクトに接続されている参照ごとにカウンタが 1 ずつ増加します。参照がリビング スペースから出るか、NULL に設定されると、カウンターは 1 ずつ減らされます。オブジェクトの参照カウンタがゼロになると、PHP はこのオブジェクトを使用する必要がなくなったことを認識し、そのオブジェクトが占有しているメモリ領域を解放します。
例:
class Person{
}
function sendEmailTo(){
}
$haohappy = new Person( )
// 新しいオブジェクトを作成します: 参照カウント Reference count = 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__ 定数 __METHOD__ 定数 =
12) ★ Reflection リフレクションの仕組み
その 1、2、3、7、10 詳細については、この記事の最後にある「PHP5 のクラスとオブジェクト」シリーズを参照してください。この記事では説明しません。記事。 9 番目の例外処理と 12 番目の反映メカニズムは、比較的内容が濃いため、紙面の都合上、記事では紹介できません。近々発行される電子雑誌「PHP & More」の第 2 号にご注目ください。具体的に記事で紹介します。
以下では、4 番目、5 番目、6 番目、8 番目、および 11 番目の言語機能を紹介します:
4) ★ クラス型のヒント
ご存知のとおり、PHP は弱く型付けされた言語です。変数を使用する前に定義する必要はなく、変数のデータ型を宣言する必要もありません。これはプログラミングに多くの利便性をもたらしますが、特に変数の型が変更された場合には、いくつかの隠れた危険ももたらします。 PHP5 では型命令が追加され、実行中にクラスメソッドのパラメータの型を自動的に決定できます。これは Java2 の RTTI に似ています。リフレクションと組み合わせることで、オブジェクトを非常に適切に制御できます。
interface Foo {
function a(Foo $foo);
}
interface Bar {
function b(Bar $bar)
}
class FooBar は Foo, Bar {を実装します。
関数 a(Foo $foo) {
// ...
}
関数 b(Bar $bar) {
// ...
}
}
$a = 新しい FooBar; FooBar;
$a->a($b);
厳密に型指定された言語では、すべての変数の型が決定されます。コンパイル時チェックは、PHP で型ディレクティブを使用して型をチェックする際に、実行時に行われます。クラス メソッド パラメーターの型が正しくない場合、「致命的なエラー: 引数 1 はインターフェイス Bar を実装する必要があります...」のようなエラー メッセージが報告されます。
次のコード:
function foo(ClassName $object) {
// ...
}
?>
function foo ($object) {
if (!($objectinstanceof 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() 関数を定義して操作を追加できます。
//Object copy
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this->id = self::$id++
} /*
function __clone() {
$this->address = "ニューヨーク";
$this->id = self::$id++;
}
*/
}
$obj = new MyCloneable( );
$obj->名前 = "こんにちは";
print $obj->id "n"; obj;
id . "n";
print $obj_cloned->>上記のコードは、同一のオブジェクトをコピーします。
その後、関数 __clone() のコメントを削除してプログラムを再実行してください。基本的には同じですが、いくつかのプロパティが変更されたオブジェクトがコピーされます。
8) ★ クラス定数 クラス定数
PHP5 では、const キーワードを使用してクラス定数を定義できます。
const = "定数";
echo "Foo::constant ."
;
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 を出力します。 // コンパイル時に評価されるトークン
function test() {
echo __METHOD__
}
test(); // テスト
を出力します。 ?>
(出典: Viphot)
http://www.bkjia.com/PHPjc/314036.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/314036.html
技術記事
※この記事は「PHP5のクラスとオブジェクト」シリーズの補足・修正であり、PHP5のオブジェクトシステムの全体的な仕組みを紹介していますが、詳しくは紹介していない機能もあります。 「...
」を読むことを強くお勧めします。