PHP5 オブジェクト コピー テクノロジーの詳細な説明_PHP チュートリアル
この記事では、PHP5のオブジェクトコピー技術を簡単なものから詳細なものまで解説します。 間違いや不適切な点があれば、ご指摘いただければ幸いです。
オブジェクトコピーの起源なぜオブジェクトに「コピー」という概念があるのでしょうか? これは、PHP5 のオブジェクトの値の転送方法と密接に関係しています。次の簡単なコードを見てみましょう。
PHPコード
/**
- *テレビカテゴリ
- */
- クラステレビ
- {
- /**
- *画面の高さ
- */
- 保護された $_screenLength = 300;
- /**
- *画面幅
- */
- 保護された $_screenHight = 200;
- /**
- ※テレビ出演カラー
- */
- 保護された $_color = '黒';
- /**
- ※テレビ出演カラーに戻ります
- */
- パブリック関数 getColor()
- {
- return $ this-> _color;
- }
- /**
- *テレビの外観色を設定します
- */
- パブリック関数 setColor($color)
- {
- $this->_color = (string)$color; $これを返します
- }
- }
- $tv1 = 新しいテレビ ();
- $tv2 = $tv1;
- このコードはテレビ クラス Television を定義します。$tv1 はテレビのインスタンスです。その後、通常の変数代入方法に従って $tv1 の値を $t2 に代入します。これで、$tv1 と $tv2 という 2 つのテレビができました。これは本当に事実でしょうか?試してみましょう。
- PHPコード
echo 'tv1 の色は: ' . $tv1->getColor();//tv1 の色は黒です
エコー '
';
エコー '
';
-
// tv2 を白にペイントします
- $tv2->setColor('白');
- echo 'tv2 の色は: ' . $tv2->getColor();//tv2 の色は白です
-
エコー '
';
echo 'tv1 の色は: ' . $tv1->getColor();//tv1 の色は白です - $tv1 = 新しいテレビ (); $tv2 = $tv1 をクローンします。
- echo 'tv1 の色は: ' . $tv1->getColor();//tv1 の色は黒です
-
エコー '
';
echo 'tv2 の色は: ' . $tv2->getColor();//tv2 の色は黒です - エコー '
- //tv2 を置き換えて白にペイントします
- $tv2->setColor('白');
- echo 'tv2 の色は: ' . $tv2->getColor();//tv2 の色は白です
- エコー '
- echo 'tv1 の色は: ' . $tv1->getColor();//tv1 の色は黒です
- このコードの 2 行目では、clone キーワードを使用して tv1 をコピーしています。これで、tv1 と tv2 の実際のコピーが作成されました。引き続き、コピーが成功したかどうかを確認します。 tv2 の色を白に変更しましたが、tv1 の色はまだ黒であることがわかり、コピー操作は成功しました。
- __クローンマジックメソッド
- /**
- *テレビカテゴリ
- */
- クラス テレビ
- {
- /**
- *テレビ番号
- */
- 保護された $_identity = 0;
- /**
- *画面の高さ
- */
- protected $_screenLength = 300;
- /**
- *画面幅
- */
- 保護された $_screenHight = 200;
- /**
- ※テレビ出演カラー
- */
- protected $_color = '黒';
- /**
- ※テレビ出演カラーに戻ります
- */
- パブリック関数getColor()
- {
- return $this->_color;
- }
- /**
- *テレビの外観色を設定します
- */
- パブリック関数 setColor($color)
- {
- $this->_color = (文字列)$color;
- $this を返します。
- }
- /**
- * TV番号に戻る
- */
- パブリック関数 getIdentity()
- {
- return $this->_identity;
- }
- /**
- *テレビ番号を設定します
- */
- パブリック関数 setIdentity($id)
- {
- $this->_identity = (int)$id;
- $this を返します。
- }
- パブリック関数 __clone()
- {
- $this->setIdentity(0);
- }
- }
- $tv1 = 新しいテレビ (); $tv1->setIdentity('111111');
- echo 'tv1 の ID は ' $tv1->getIdentity();//111111
-
エコー '
'; - $tv2 = $tv1 をクローンします。
- echo 'tv2 の ID は ' $tv2->getIdentity();//0
- テレビ セット tv1 を作成し、その番号を 111111 に設定しました。次に、clone を使用して tv1 をコピーし、__clone マジック メソッドがトリガーされました。このメソッドは、コピーされたオブジェクト tv2 に直接作用します。メソッドでは、setIdentity メンバー メソッドを呼び出して tv2 の _identity 属性をクリアし、後で番号を付け直すことができるようにします。このことから、__clone マジック メソッドを使用すると、オブジェクトのクローンを作成するときにいくつかの追加操作を非常に便利に実行できることがわかります。
- /**
- *テレビカテゴリ
- */
- クラス テレビ
- {
- /**
- *テレビ番号
- */
- 保護された $_identity = 0;
- /**
- *画面の高さ
- */
- protected $_screenLength = 300;
- /**
- *画面幅
- */
- 保護された $_screenHight = 200;
- /**
- ※テレビ出演カラー
- */
- protected $_color = '黒';
- /**
- * リモコンオブジェクト
- */
- protected $_control = null;
- /**
- * リモコンオブジェクトをコンストラクターにロードします
- */
- パブリック関数 __construct()
- {
- $this->setControl(new Telecontrol());
- }
- /**
- * リモコンオブジェクトを設定します
- */
- public function setControl(Telecontrol $control)
- {
- $this->_control = $control;
- $this を返します。
- }
- /**
- * リモコンオブジェクトを返します
- */
- パブリック関数 getControl()
- {
- return $this->_control;
- }
- /**
- ※テレビ出演カラーに戻ります
- */
- パブリック関数getColor()
- {
- return $this->_color;
- }
- /**
- *テレビの外観色を設定します
- */
- パブリック関数 setColor($color)
- {
- $this->_color = (文字列)$color;
- $this を返します。
- }
- /**
- * TV番号に戻る
- */
- パブリック関数 getIdentity()
- {
- $ this-& gt; を返します。 }
- /**
- *テレビ番号を設定します
- */
- パブリック関数 setIdentity($id)
- {
- $this->_identity = (int)$id;
- $これを返します
- }
- パブリック関数 __clone()
- {
- $this->setIdentity(0);
- }
- }
- /**
- *リモコンカテゴリ
- */
- クラステレコントロール
- {
- }
- $contr1 = $tv1->getControl(); //tv1 のリモコン contr1 を取得します
- $contr2 = $tv2->getControl(); //tv2 のリモコン contr2 を取得します
- echo $tv1; //tv1 のオブジェクト ID は #1 です
-
エコー '
';
echo $contr1; // contr1 のオブジェクト ID は #2 です - エコー '
- echo $tv2; //tv2 のオブジェクト ID は #3 です
-
エコー '
';
echo $contr2; // contr2 のオブジェクト ID は #2 です - コピー後、オブジェクト ID を確認し、クローン操作によって tv1 から tv2 をコピーします。tv1 と tv2 のオブジェクト ID はそれぞれ 1 と 3 です。これは、tv1 と tv2 が 2 つの異なる TV オブジェクトを参照していることを意味します。これは、クローンと一致しています。の操作の結果。次に、tv1 のリモコン オブジェクト contr1 と tv2 のリモコン オブジェクト contr2 をそれぞれ取得しました。それらのオブジェクト ID を確認すると、contr1 と contr2 のオブジェクト ID は両方とも 2 であり、同じものへの参照であることがわかります。オブジェクト、つまり、tv1 から tv2 をコピーしたが、リモコンはコピーされていないというのは明らかに不合理です。各テレビにはリモコンが装備されているはずであり、ここで tv2 と tv1 はリモコンを共有しています。
- クローン操作には非常に大きな欠陥があることがわかります。クローン操作を使用してオブジェクトをコピーする場合、コピーされたオブジェクトに他のオブジェクトへの参照がある場合、参照されたオブジェクトはコピーされません。ただし、この状況は現在、「継承の再利用」に代わる「合成/集約の再利用」が主に提唱されており、「合成」と「集約」は、あるオブジェクトに別のオブジェクトへの参照を持たせることで、それを再利用します。参照されるオブジェクトのメソッド。クローンを使用する場合は、この状況を考慮する必要があります。では、オブジェクトを複製するときにこのような欠陥をどのように解決すればよいでしょうか?おそらく、前述の __clone マジック メソッドをすぐに思いついたかもしれません。これは確かに解決策です。
- パブリック関数 __clone()
- {
- $this->setIdentity(0); // リモート コントロール オブジェクトをリセットします
- $this->setControl(new Telecontrol());
- }
- $contr1 = $tv1->getControl(); //tv1 のリモコン contr1 を取得します
- $contr2 = $tv2->getControl(); //tv2 のリモコン contr2 を取得します
- echo $tv1; //tv1 のオブジェクト ID は #1 です
- エコー '
- echo $contr1; // contr1 のオブジェクト ID は #2 です
-
エコー '
';
echo $tv2; //tv2 のオブジェクト ID は #4 です - エコー '
- echo $contr2; // contr2 のオブジェクト ID は #5 です
- 出力を見ると、tv1 と tv2 に異なるリモコンがあることがわかります。これは、オプション 1 よりもはるかに便利です。シリアル化は再帰的なプロセスです。オブジェクト内で参照されるオブジェクトの数や、オブジェクトを完全にコピーできるレイヤーの数を気にする必要はありません。このソリューションを使用する場合、__clone マジック メソッドをトリガーして追加の操作を完了することはできないことに注意してください。 もちろん、ディープ コピー後に再度クローン操作を実行して __clone マジック メソッドをトリガーすることはできますが、効率には多少の影響があります。さらに、この解決策はコピーされたオブジェクトとすべての参照オブジェクトの __sleep および __wakeup マジック メソッドをトリガーするため、これらの状況を考慮する必要があります。
- まとめ
まず、tv1 と tv2 の色が両方とも黒であることがわかります。次に、tv2 の色を変更したいので、その色を白に設定します。実際に、一致しているように見えます。要件は満たしていましたが、tv1 の色を確認すると、期待したほどスムーズではありませんでした。 tv1 の色をリセットしなかったのはなぜですか?なぜなら、PHP5におけるオブジェクトの代入や値の受け渡しはすべて「参照」によって行われるからです。 PHP5 は Zend Engine II を使用しており、オブジェクトは他の一般変数のように Zval に保存されるのではなく、別の構造のオブジェクト ストアに保存されます (PHP4 では、オブジェクトは一般変数と同様に Zval に保存されます)。オブジェクトの内容 (値) ではなく、オブジェクトのポインターのみが Zval に格納されます。オブジェクトをコピーする場合、またはオブジェクトをパラメーターとして関数に渡す場合、データをコピーする必要はありません。同じオブジェクト ポインターを保持し、この特定のオブジェクトが別の zval を介してポイントしていることをオブジェクト ストアに通知するだけです。オブジェクト自体はオブジェクト ストアに配置されているため、オブジェクトに加えた変更は、そのオブジェクトへのポインタを保持するすべての zval 構造に影響します。これは、ターゲット オブジェクトに対する変更がソース オブジェクトに影響するため、プログラムに明示されています。これにより、PHP オブジェクトが常に参照によって渡されるように見えます。したがって、上記の tv2 と tv1 は実際には同じ TV インスタンスを指しており、tv1 または tv2 で行う操作は実際にはこの同じインスタンスに対するものです。したがって、「コピー」は失敗しました。このため、PHP5 ではオブジェクトのコピーに特化した操作 (clone) が提供されています。ここでオブジェクトのコピーが登場します。
クローンを使用してオブジェクトをコピーします
PHP5 のクローン言語構造を使用してオブジェクトをコピーするコードは次のとおりです:
PHPコード
';
';
ここで、各テレビに独自の番号が必要であるという状況を考えます。この番号は、ID 番号と同様に一意である必要があるため、テレビをコピーするときに、トラブルを避けるために番号もコピーされることは望ましくありません。私たちが考え出した戦略の 1 つは、割り当てられている TV 番号をクリアし、必要に応じて番号を再割り当てすることです。
このような問題を解決するために、__clone マジック メソッドが特に使用されます。オブジェクトがコピーされる (つまり、クローン操作) ときに、__clone マジック メソッドがトリガーされます。 TV クラス Television のコードを変更し、number 属性と __clone メソッドを追加しました。コードは次のとおりです。
PHPコード
以下では、このようなテレビのオブジェクトを作成します。
PHP代
クローン操作の致命的な欠陥
クローンは本当に理想的なコピー効果を実現できるのでしょうか?場合によっては、クローン操作が想像したほど完璧ではないことがわかるはずです。上記の TV タイプを変更してテストしてみましょう。
各テレビにはリモコンが付属しているので、リモコンのクラスを開きます。リモコンとテレビは「集合」関係です (「組み合わせ」関係と比較すると、依存関係は弱いです。一般的に言えば、次のとおりです)。テレビはリモコンがなくても通常どおり使用できます)。これで、TV オブジェクトはすべてリモコン オブジェクトへの参照を保持するはずです。以下のコードを見てください
PHPコード
次に、そのような TV オブジェクトをコピーし、TV のリモコン オブジェクトを観察します。
PHPコード
$tv1 = 新しいテレビ ();
-
$tv2 = $tv1 をクローンします。
';
__clone マジック メソッドの使用についてはすでに紹介しました。コピーされたオブジェクト内の他のオブジェクトの参照を、__clone メソッド内の新しいオブジェクトに再参照できます。変更された __clone() マジック メソッドを見てみましょう:
PHPコード
04 行目では、コピーした TV オブジェクトのリモコンをリセットします。前の方法に従ってオブジェクト ID を確認すると、2 つの TV のリモコンのオブジェクト ID が異なることがわかり、問題は解決されました。
しかし、この方法はおそらくあまり良くありません。コピーされたオブジェクトに他のオブジェクトへの参照が複数ある場合、__clone メソッドでそれらを 1 つずつリセットする必要があります。さらに悪いことに、コピーされたオブジェクトのクラスが によって提供されている場合です。ただし、コードを変更することはできないため、コピー操作は基本的にスムーズに完了しません。
オブジェクトをコピーするにはクローンを使用します。この種のコピーは「浅いコピー」と呼ばれます。コピーされたオブジェクトのすべての変数には元のオブジェクトと同じ値が含まれており、他のオブジェクトへの参照はすべて元のオブジェクトを指し続けます。つまり、浅いコピーは、参照しているオブジェクトではなく、問題のオブジェクトのみをコピーします。 「浅いコピー」と比較すると、もちろん「深いコピー」もあります。コピーされたオブジェクトのすべての変数には、他のオブジェクトを参照する変数を除き、元のオブジェクトと同じ値が含まれます。つまり、ディープ コピーでは、コピー対象のオブジェクトが参照するすべてのオブジェクトがコピーされます。ディープ コピーでは、何層まで進むかを決定する必要がありますが、これは簡単に決定できない問題であり、さらに、循環参照の問題が発生する可能性があるため、慎重に処理する必要があります。オプション 2 はディープ コピー ソリューションです。
解決策 2: ディープコピーにシリアル化を使用する
PHP にはシリアル化 (シリアル化) 関数と逆シリアル化 (アンシリアル化) 関数があり、serialize() を使用してオブジェクトをストリームに書き込み、ストリームからオブジェクトを読み取るだけで、オブジェクトがコピーされます。 JAVA 言語では、このプロセスは「冷却」および「解凍」と呼ばれます。以下でこのメソッドをテストします:
PHPコード
$tv1 = 新しいテレビ ();
-
$tv2 = unserialize(serialize($tv1));//シリアル化してから逆シリアル化します
';
';
オブジェクトのコピー方法が異なれば効果も異なります。どの方法を使用するか、特定のアプリケーション要件に基づいてコピー方法を改善する方法を検討する必要があります。 PHP5 のオブジェクト指向機能は比較的 JAVA に近いので、JAVA から多くの貴重な経験を学ぶことができると思います
。
ホット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)

ホットトピック









私たちユーザーは、このプラットフォームを使用する際にいくつかの機能の多様性を理解できるはずであり、いくつかの曲の歌詞は非常によく書かれていることがわかります。何度か聞いて、とても深い意味を感じることもあるので、意味を理解したい場合は、そのままコピーしてコピーライティングとして使いたくなりますが、使いたい場合は、まだ必要です 歌詞をコピーする方法を学ぶ必要があります 誰もがこれらの操作に慣れていると思いますが、携帯電話での操作は確かに少し難しいです。 そこで、よりよく理解するために、今日は編集者がは、あなたを助けるためにここにあります。上記の操作エクスペリエンスのいくつかをわかりやすく説明しています。もし気に入ったら、エディターと一緒に見に来てください。お見逃しなく。

StableDiffusion3 の論文がついに登場しました!このモデルは2週間前にリリースされ、Soraと同じDiT(DiffusionTransformer)アーキテクチャを採用しており、リリースされると大きな話題を呼びました。前バージョンと比較して、StableDiffusion3で生成される画像の品質が大幅に向上し、マルチテーマプロンプトに対応したほか、テキスト書き込み効果も向上し、文字化けが発生しなくなりました。 StabilityAI は、StableDiffusion3 はパラメータ サイズが 800M から 8B までの一連のモデルであると指摘しました。このパラメーター範囲は、モデルを多くのポータブル デバイス上で直接実行できることを意味し、AI の使用を大幅に削減します。

自動運転では軌道予測が重要な役割を果たしており、自動運転軌道予測とは、車両の走行過程におけるさまざまなデータを分析し、将来の車両の走行軌跡を予測することを指します。自動運転のコアモジュールとして、軌道予測の品質は下流の計画制御にとって非常に重要です。軌道予測タスクには豊富な技術スタックがあり、自動運転の動的/静的知覚、高精度地図、車線境界線、ニューラル ネットワーク アーキテクチャ (CNN&GNN&Transformer) スキルなどに精通している必要があります。始めるのは非常に困難です。多くのファンは、できるだけ早く軌道予測を始めて、落とし穴を避けたいと考えています。今日は、軌道予測に関するよくある問題と入門的な学習方法を取り上げます。関連知識の紹介 1. プレビュー用紙は整っていますか? A: まずアンケートを見てください。

この論文では、自動運転においてさまざまな視野角 (遠近法や鳥瞰図など) から物体を正確に検出するという問題、特に、特徴を遠近法 (PV) 空間から鳥瞰図 (BEV) 空間に効果的に変換する方法について検討します。 Visual Transformation (VT) モジュールを介して実装されます。既存の手法は、2D から 3D への変換と 3D から 2D への変換という 2 つの戦略に大別されます。 2D から 3D への手法は、深さの確率を予測することで高密度の 2D フィーチャを改善しますが、特に遠方の領域では、深さ予測に固有の不確実性により不正確さが生じる可能性があります。 3D から 2D への方法では通常、3D クエリを使用して 2D フィーチャをサンプリングし、Transformer を通じて 3D と 2D フィーチャ間の対応のアテンション ウェイトを学習します。これにより、計算時間と展開時間が増加します。

MySQL クエリ結果の配列をオブジェクトに変換する方法は次のとおりです。 空のオブジェクト配列を作成します。結果の配列をループし、行ごとに新しいオブジェクトを作成します。 foreach ループを使用して、各行のキーと値のペアを新しいオブジェクトの対応するプロパティに割り当てます。新しいオブジェクトをオブジェクト配列に追加します。データベース接続を閉じます。

9 月 23 日、論文「DeepModelFusion:ASurvey」が国立国防技術大学、JD.com、北京理工大学によって発表されました。ディープ モデルの融合/マージは、複数のディープ ラーニング モデルのパラメーターまたは予測を 1 つのモデルに結合する新しいテクノロジーです。さまざまなモデルの機能を組み合わせて、個々のモデルのバイアスとエラーを補償し、パフォーマンスを向上させます。大規模な深層学習モデル (LLM や基本モデルなど) での深層モデルの融合は、高い計算コスト、高次元のパラメーター空間、異なる異種モデル間の干渉など、いくつかの課題に直面しています。この記事では、既存のディープ モデル フュージョン手法を 4 つのカテゴリに分類します。 (1) 「パターン接続」。損失低減パスを介して重み空間内の解を接続し、より適切な初期モデル フュージョンを取得します。

上記と著者の個人的な理解は、画像ベースの 3D 再構成は、一連の入力画像からオブジェクトまたはシーンの 3D 形状を推測することを含む困難なタスクであるということです。学習ベースの手法は、3D形状を直接推定できることから注目を集めています。このレビュー ペーパーは、これまでにない新しいビューの生成など、最先端の 3D 再構成技術に焦点を当てています。入力タイプ、モデル構造、出力表現、トレーニング戦略など、ガウス スプラッシュ メソッドの最近の開発の概要が提供されます。未解決の課題と今後の方向性についても議論します。この分野の急速な進歩と 3D 再構成手法を強化する数多くの機会を考慮すると、アルゴリズムを徹底的に調査することが重要であると思われます。したがって、この研究は、ガウス散乱の最近の進歩の包括的な概要を提供します。 (親指を上にスワイプしてください

Windows では、コピーのショートカット キーは Ctrl C、Apple では、コピーのショートカット キーは Command C、Linux では、コピーのショートカット キーは Ctrl Shift C です。これらのショートカット キーを知っておくと、ユーザーの作業効率が向上し、テキストやファイルのコピー操作が容易になります。
