セクション 15 -- Zend エンジンの開発
/*
------------------------------------------- ----------------------------------
| この記事は Haohappy<
| = 章のクラスとオブジェクトのメモ
| = 不要なトラブルを避けるため、転載しないでください。批判や修正は大歓迎です。私たちはすべての PHP 愛好家とともに進歩していきたいと考えています。
= PHP5 Research Center: http://blog.csdn.net/haohappy2004
--------- ----- -------------------------------------- ----- ---------------
*/
セクション 15 -- Zend エンジンの開発
この章の最後のセクションで、Zeev は次のように説明しています。 Zend Engine オブジェクト モデルによってもたらされるメリット、特に以前のバージョンの PHP のモデルとの違いについて説明します。
1997 年の夏に PHP3 を開発したとき、その時点では PHP をオブジェクト指向にする計画はありませんでした。 PHP3 は純粋にプロセス指向の言語ですが、1997 年 8 月 27 日の夜にクラスのサポートが PHP に追加されました。当時は PHP を研究する人が少なすぎたので、1997 年 8 月から、PHP はオブジェクト指向プログラミング言語への第一歩を踏み出しました。
実際、これは最初の一歩にすぎません。この設計ではオブジェクトのサポートが十分ではないため、$foo["bar"] を使用する代わりに、オブジェクトを使用することができます。より見栄えの良い $foo- >bar を使用してください。オブジェクト指向のアプローチの主な利点は、メンバー関数またはメソッドを通じて機能を格納することです。ただし、例のアプローチと実際にはそれほど違いはありません。 6.19.
リスト 6.18 PHP 3 のオブジェクト指向プログラミング PHP3 のオブジェクト指向プログラミング
コードをコピーします コードは次のとおりです。 > class 例 {
var $value = "何らかの値"; function PrintValue()
{
print $this->value; > > $obj = new Example(); ;PrintValue();
?>
リスト 6.19 PHP 3 の構造化プログラミング PHP3 の構造化プログラミング
コードをコピー
コードは次のとおりです:
{ print $arr["value "] ; } function CreateExample() {
$arr["value"] = "何らかの値"; $arr["PrintValue"] = "PrintValue";
return $arr;
}
$arr = CreateExample();
//PHP の間接参照を使用します
$arr["PrintValue"]($arr)>?
上記では、クラスに 2 行のコードを記述するか、関数に配列を明示的に渡していますが、PHP3 ではこれら 2 つのオプションに違いがないことを考慮すると、オブジェクト モデルを単に「構文上の光沢」として扱うことができます。
オブジェクト指向開発に PHP を使用したいと考えている人、特にデザイン パターンを使用したいと考えている人は、すぐに壁にぶつかることに気づきました。幸いなことに、当時 (PHP3 時代) は、これを必要とする人は多くありませんでした。
PHP ではこの状況が変わり、PHP の異なる識別子がメモリ内の同じアドレスを指すことができるようになります。例 6.20 のように、同じ変数にさらに名前を付けます。
リスト 6.20 PHP 4 の参照 PHP4 の参照
コードをコピー
$a = 5;
//$b は $a と同じメモリの場所を指し、$b はメモリの同じアドレスを指します
$b = & $a;
//$a が $b を変更することを指しているので、$b を変更します。
// 同じ場所です - $a が指すアドレスも変わります
$b = 7;
//prints 7 Output 7
print $a;
?>
コードをコピー コードは次のとおりです:
1 class MyFoo {
2 function MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 5;
6 }
7
8 function setValue($val)
9 {
10 $this->value = $val;
11 }
12
13 function getValue()
14 {
15 return $this->value;
16 }
17
18 function getValueFromMe()
19 {
20 return $this->me->value;
21 }
22 }
23
24 関数 CreateObject($class_type)
25 {
26 スイッチ ($class_type) {
27 case "foo":
28 $obj = new MyFoo();
29 休憩;
30 case "bar":
31 $obj = new MyBar();
32 休憩;
33 }
34 return $obj;
35 }
36
37 $global_obj = CreateObject ("foo");
38 $global_obj->setValue(7);
39
40 print 「値は 」 。 $global_obj->getValue() 。 「ん」;
41 print 「値は 」 。 $global_obj->getValueFromMe() 。 「ん」;
まず、MyFoo クラスがあり、$this->me に参照を与え、それを設定します。
他に 3 つのメンバー関数があります: の値を設定するセッター。 this->value; 1 つは this->value の値を返し、もう 1 つは this->value->me の値を返します。しかし、 --$this は同じものではないでしょうか? ) MyFoo::getValueFromMe() によって返される値と同じではありませんか?
まず、MyFoo 型のオブジェクトを返す CreateObject("foo") を呼び出します。次に、MyFoo::setValue() を呼び出します。 7) 最後に、MyFoo::getValue() と MyFoo::getValueFromMe() を呼び出し、戻り値 7 を取得することを期待します。
もちろん、いずれの場合でも 7 を取得した場合、上記の例は起こりません。この本の中で最も意味のない例です。おわかりかと思いますが、7 が 2 つありません。
しかし、どのような結果が得られるのでしょうか。さらに重要なのは、なぜ得られるのでしょうか?理由としては、3 つあります。
まず、コンストラクター内で this と this->me の間の参照を確立します。そして、この ->me も同じことです。しかし、コンストラクターが終了すると、PHP はオブジェクト (new MyFoo、行 28) を再作成し、それを $obj に割り当てる必要があります。他のデータ型と同様に、X を Y に割り当てることは、Y が X のコピーであることを意味します。つまり、obj は、コンストラクター内に存在するオブジェクトである new MyFoo のコピーになります。 ;me どうでしょうか? これは参照であるため、元のオブジェクトを指しています。これは、どちらか一方を変更しても、もう一方は変わりません。 > これが最初の理由です。奇跡的に、オブジェクトのインスタンス化の問題 (28 行目) を克服できますが、それでも同じ問題に遭遇する必要があります。上記と同様 - global_object は戻り値のコピーになり、やはり global_object と global_object->me は同じではなくなります。これが 2 番目の理由です。
しかし、実際にはそうはいきません。まだ遠い — CreateObject が $obj を返したら、参照を破棄します (行 34)。
これを修正するにはどうすればよいでしょうか。1 つは、どこにでもアンパサンドを追加することです。例 6.22 (行 24、28、31、37) のように、2. 幸運にも PHP5 を使用できる場合は、上記のすべてを忘れても構いません。PHP5 がどのように考慮するかを知りたい場合は、これらを自動的に考慮します。
リスト 6.22 PHP 4 の WTMA シンドローム PHP4 の WTMA シンドローム
コードをコピーします コードは次のとおりです。 1 class MyFoo {
2 function MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 2;
6 }
7
8 function setValue($val)
9 {
10 $this->value = $val;
11 }
12
13 function getValue()
14 {
15 return $this->value;
16 }
17
18 function getValueFromMe()
19 {
20 return $this->me->value;
21 }
22 };
23
24 function &CreateObject($class_type)
25 {
26 switch ($class_type) {
27 case "foo" :
28 $obj =& new MyFoo() ;
29 休憩;
30 case "bar":
31 $obj =& new MyBar();
32 休憩;
33 }
34 return $obj;
35 }
36
37 $global_obj =& CreateObject ("foo");
38 $global_obj->setValue(7);
39
40 print 「値は 」 。 $global_obj->getValue() 。 「ん」;
41 print 「値は 」 。 $global_obj->getValueFromMe() 。 「ん」;
PHP5 は、オブジェクトを他のタイプのデータとは異なる方法で扱う最初の PHP バージョンです。ユーザーの観点から見ると、これは非常に明らかです。PHP5 では、オブジェクトは常に参照によって渡されますが、他のタイプのデータ (整数、最も注目すべき点は、オブジェクトを参照によって渡すことを示すために & 記号を使用する必要がないことです。
オブジェクト指向プログラミングでは、オブジェクト ネットワークと複雑なオブジェクト間の関係が広範囲に使用されます。 、これらはすべて参照の使用を必要とします。PHP の以前のバージョンでは、参照を明示的に指定する必要がありました。そのため、オブジェクトの移動は参照によって行われ、明示的にコピーが要求された場合にのみコピーされます。これは以前よりも優れています。
どのように実装されていますか?
PHP5 より前では、すべての値は zval (Zend Value) と呼ばれる特別な構造体に格納されていました。これらの値は、数値や文字列などの単純な値、または複合値として格納できました。配列やオブジェクトなどの値。関数に値が渡されるとき、または関数から返されるとき、これらの値はコピーされ、メモリ内の別のアドレスに同じ内容の構造体が作成されます。オブジェクトを除いて、値は依然として zval 構造に格納されます。オブジェクトはオブジェクト ストアと呼ばれる構造に存在し、各オブジェクトは異なる ID を持ちます。Zval では、オブジェクト自体は格納されませんが、オブジェクトへのポインタが格納されます。ホルダーをコピーする場合、オブジェクトの zval 構造体が存在します。たとえば、オブジェクトを関数にパラメータとして渡す場合、同じオブジェクト ポインタを保持してオブジェクト ストアに通知するだけです。これは、この特定のオブジェクトが別の zval によってポイントされるようになるためです。オブジェクト自体はオブジェクト ストアに配置されており、これに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造に影響を与えるため、PHP オブジェクトはオブジェクトであるかのように見えます。
PHP5 を使用して例 6.21 に戻り、すべてのアンパサンドを削除しても、コンストラクター内で参照を保持してもすべて正常に動作します。 ) & 記号は使用されません。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Gigabyte のマザーボードでキーボード起動を設定する方法 まず、キーボード起動をサポートする必要がある場合は、PS2 キーボードである必要があります。 !設定手順は次のとおりです: ステップ 1: 起動後に Del または F2 を押して BIOS に入り、BIOS の Advanced (Advanced) モードに移動します 通常のマザーボードは、デフォルトでマザーボードの EZ (Easy) モードに入ります。 F7 を押してアドバンスト モードに切り替える必要があります。ROG シリーズ マザーボードはデフォルトで BIOS に入ります。アドバンスト モード (説明には簡体字中国語を使用します) ステップ 2: - [アドバンスト] - [アドバンスト パワー マネージメント (APM)] を選択します。 ステップ 3 : オプション [PS2 キーボードによるウェイクアップ] を見つけます ステップ 4: このオプション デフォルトは無効です プルダウンすると、3 つの異なる設定オプションが表示されます: [スペースバー] を押してコンピューターの電源をオンにし、グループを押します

1. プロセッサ コンピュータ構成を選択する場合、プロセッサは最も重要なコンポーネントの 1 つです。 CS などのゲームをプレイする場合、プロセッサーのパフォーマンスはゲームのスムーズさや応答速度に直接影響します。 Intel Core i5 または i7 シリーズ プロセッサを選択することをお勧めします。これらのプロセッサは、強力なマルチコア処理能力と高周波数を備え、CS の高い要件に簡単に対応できるためです。 2. グラフィックス カード グラフィックス カードは、ゲームのパフォーマンスを左右する重要な要素の 1 つです。 CSなどのシューティングゲームでは、グラフィックカードの性能がゲーム画面の鮮明さや滑らかさに直結します。優れたグラフィックス処理能力と高いフレームレート出力を備え、より優れたゲーム体験を提供できる NVIDIA GeForce GTX シリーズまたは AMD Radeon RX シリーズ グラフィックス カードを選択することをお勧めします。

マザーボード上の SPDIFOUT 接続線の順序 最近、ワイヤの配線順序に関する問題に遭遇しました。ネットで調べたところ、1、2、4がアウト、+5V、グラウンドに相当するという情報もあれば、1、2、4がアウト、グラウンド、+5Vに相当するという情報もありました。最善の方法は、マザーボードのマニュアルを確認することです。マニュアルが見つからない場合は、マルチメーターを使用して測定できます。最初にアースを見つけてから、残りの配線の順序を決定します。マザーボードの VDG 配線の接続方法 マザーボードの VDG 配線を接続するときは、VGA ケーブルの一端をモニターの VGA インターフェイスに差し込み、もう一端をコンピューターのグラフィックス カードの VGA インターフェイスに差し込む必要があります。マザーボードの VGA ポートに差し込まないよう注意してください。接続すると、次のことが可能になります

Glodon Software は建築情報化分野に注力するソフトウェア会社で、その製品は建築の設計、建設、運用のあらゆる側面で広く使用されています。 Glodon ソフトウェアは機能が複雑でデータ量が大きいため、高度なコンピュータ構成が必要です。この記事では、読者が適切なコンピューター構成プロセッサーを選択できるように、Glodon Software のコンピューター構成に関する推奨事項をさまざまな側面から詳しく説明します。Glodon Software は、アーキテクチャー設計、シミュレーション、その他の操作を実行するときに大量のデータの計算と処理を必要とします。プロセッサの方が高いです。 Intel i7 シリーズや AMD Ryzen シリーズなど、マルチコアの高周波数プロセッサを選択することをお勧めします。これらのプロセッサは強力なコンピューティング能力とマルチスレッド処理能力を備えており、Glodon ソフトウェアのニーズをより適切に満たすことができます。メモリ メモリがコンピューティングに影響を与えています

10月8日のニュースによると、米国の自動車市場は水面下で変化を遂げており、これまで親しまれてきた6気筒や8気筒エンジンが徐々にその優位性を失い、3気筒エンジンが台頭しつつあるという。 10月8日のニュースは、米国の自動車市場が水面下で変化を遂げていることを示した。かつて愛された6気筒や8気筒エンジンは徐々にその優位性を失い、3気筒エンジンが台頭し始めているが、アメリカ人の多くの心の中には大排気量モデルが大好きで「アメリカンビッグV8」というイメージがある。常にアメリカ車の代名詞であり続けています。しかし、最近海外メディアが発表したデータによると、米国の自動車市場の状況は大きく変化しており、水面下での争いは激化している。 2019 年以前は、米国が

リアルタイム グローバル イルミネーション (リアルタイム GI) は、常にコンピュータ グラフィックスの聖杯でした。長年にわたり、業界はこの問題を解決するためにさまざまな方法を提案してきました。一般的な方法には、静的ジオメトリ、大まかなシーン表現、または大まかなプローブの追跡などの特定の仮定を利用して問題領域を制約すること、および 2 つの間の照明を補間することが含まれます。 Unreal Engine のグローバル イルミネーションおよび反射システム Lumen テクノロジーは、Krzysztof Narkowicz と Daniel Wright によって共同設立されました。目標は、均一な照明と焼き付けたような照明品質を実現できる、以前のものとは異なるソリューションを構築することでした。最近、SIGGRAPH 2022 でクシシュトフ・ナルコ氏が

どの 1155 ピン CPU が最適かを教えてください。現在最も性能の高い 1155 ピン CPU は Intel Corei7-3770K です。 4 コアと 8 スレッド、3.5 GHz の基本周波数を備え、最大 3.9 GHz に達する TurboBoost2.0 テクノロジーをサポートします。また、8MBのレベル3キャッシュを搭載し、最も強力なCPU Intel Core i73770KのLGA1155ピンを搭載した優れたプロセッサーです。 LGA1155 インターフェイスは、第 2 世代および第 3 世代の Core プロセッサで使用されるインターフェイス タイプです。最もパフォーマンスが高いのは Intel Core i73770K です。このプロセッサのパラメータは次のとおりです: 1. 適用可能なタイプ: デスクトップ; 2. CPU シリーズ: Core i7; 3. 。 CPU

チベットにバックパッキングに行く予定です ①バッグは何リットルくらい持っていきますか?ベストな構成を教えてください 私は170歳で体力はありますが、初めてハイキングに行ったときは60リットルでしたリットル以上 ハイキングの量は60リットル未満 移動はすべて車でした リュックサックは必要ありません、スーツケースが便利です どうしても何かを持ち歩きたい場合は25〜40リットルチベット旅行の必需品:サングラス、日よけ帽子、日焼け止め、スキンクリーム、リップクリーム、長袖上着、セーター;特別な旅行やアリ、北チベット、四川チベット線への旅行の場合は、これが必要です。持参推奨品:寝袋(防寒)、シーツ(汚れ防止)、ダウンジャケット、旅行靴または登山靴、スリッパ、歯ブラシ、歯磨き粉、タオル、巻き紙、紙パンツ、消毒用ワイプ、懐中電灯、防水マッチ、ナイフ、ロープ。フロント バッグにコンピューターを入れて持ち運べますか? フロント バッグにコンピューターを入れて持ち運べますか? バックパックによっては、フロント バッグに入れて持ち運べますか?
