Zendエンジンの開発 [15]
この章の最後のセクションでは、Zend エンジンによってもたらされたオブジェクト モデルについて、特にそれが以前のバージョンの PHP のモデルとどのように異なるのかについて説明します。
1997 年の夏に PHP3 を開発したとき、私たちはそうしませんでした。当時、PHP をオブジェクト指向にする計画はありませんでしたが、PHP3 は純粋にプロセス指向の言語でした。しかし、1997.8 の夕方にクラスのサポートが追加されました。 27. 追加 PHP の新機能は、当時は PHP を研究する人が少なすぎたので、最小限の議論だけで済みました。そのため、1997 年 8 月から、PHP はオブジェクト指向プログラミング言語への第一歩を踏み出しました。
実際、これは単なる最初のステップにすぎません。この設計には関連するアイデアがほとんどないため、このバージョンでのオブジェクトの使用は、配列にアクセスするための優れた方法に過ぎません。 "bar"] を使用すると、より見栄えの良い $foo->bar を使用できます。オブジェクト指向アプローチの主な利点は、メンバー関数またはメソッドを通じて機能を保存できることです。例 6.18 に示します。実際には、例 6.19 のアプローチとあまり変わりません。
リスト 6.18 PHP 3 のオブジェクト指向プログラミング PHP3 のオブジェクト指向プログラミング
class 例
{
var $value = "何らかの値";
function PrintValue()
{
print $this->value;リスト 6.19 PHP 3 の構造化プログラミング PHP3 の構造化プログラミング
function PrintValue($arr)
{
print $arr["value"];
}
function CreateExample()
{
$arr["値"] = "値";
$arr["PrintValue"] = "PrintValue";
$arr
$arr = CreateExample();
//PHP の間接参照を使用します
$arr["PrintValue"]($arr);
?>配列を関数に明示的に渡しますが、PHP3 ではこれら 2 つのオプションに違いはありません。
を使用したい人は、オブジェクト モデルを単に「構文上のホワイトウォッシュ」として使用することもできます。オブジェクト指向開発に PHP を使用していた人、特にデザイン パターンを使用したいと考えていた人は、すぐに壁にぶつかったことがわかりました。幸いなことに、当時 (PHP3 時代)、オブジェクト指向開発に PHP を使用したいと考えている人は多くありませんでした。
PHP4 ではこの状況が変わり、参照という概念が導入されました。これにより、PHP の異なる識別子がメモリ内の同じアドレスを指すことができるようになります。これは、次のように、2 つ以上の Name を使用して同じ変数に名前を付けることができることを意味します。例 6.20.
リスト 6.20 PHP 4 の参照 PHP4 の参照
$a = 5;
//$b は $a と同じメモリの場所を指し、$b はメモリの同じアドレスを指します
$b = & $a;
//$a が $b を変更することを指しているため、$b を変更します。
// 同じ場所です - 指しているアドレスも変わります$a によっても変更されます。 Change
$b = 7;
//prints 7 Output 7
print $a;
?>すべてのオブジェクト指向設計パターンの基礎であるため、この改善は非常に重要です。参照を使用すると、より強力なオブジェクト指向アプリケーションを作成できるようになりますが、PHP は、他の PHP4 プログラマと同様にオブジェクトやその他の種類のデータを扱います。言っておきますが、このアプリケーションは WTMA (Way Too Many Ampersands&) 症候群に悩まされることになります。実際のアプリケーションを構築したい場合は、例 6.21 を見れば理解できるでしょう。 🎜> リスト 6.21 PHP 4 のオブジェクトに関する問題 PHP4 でのオブジェクトの使用に関する問題
1 クラス MyFoo {
2 関数 MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 5;
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 ->値;
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() . "n";
41 print "値は " . $global_obj->getValueFromMe() .
まず、コンストラクター内に MyFoo クラスがあり、 $this->me に参照を与え、
を設定します。 1 つは、 this-> の値を設定します。 value; 1 つは this->value の値を返し、もう 1 つは this->value->me の値を返します。しかし、 --$this と MyFoo は同じものではないでしょうか。 :getValueFromMe() によって返される値は同じではありませんか?
まず、CreateObject("foo") を呼び出します。これにより、MyFoo 型のオブジェクトが返されます。次に、MyFoo::setValue(7) を呼び出します。最後に、MyFoo::getValue() と MyFoo::getValueFromMe() を呼び出し、戻り値 7 を取得することを期待します。
もちろん、いずれの場合でも 7 を取得したとしても、上記の例はそれほど意味のあるものではありません。この本の例では、もうおわかりかと思いますが、
では、どのような結果が得られるのでしょうか。さらに重要なのは、なぜですか?得られた結果はそれぞれ 7 と 5 です。理由としては、3 つあります。
まず、コンストラクター内で this と this->me を確立します。つまり、this と this->me は同じものですが、コンストラクターが終了すると、PHP はオブジェクト (new MyFoo の 28 行目) を再作成して代入する必要があります。他のデータ型と同様に、オブジェクトは特殊化されていないため、 X を Y に割り当てることは、 Y が X のコピーであることを意味します。つまり、 obj は、オブジェクトのコピーである新しい MyFoo のコピーになります。 Obj->me はどうですか? これは参照であるため、元のオブジェクトを指しています。これはもう同じものではありません。変更しても変わりません。
上記が最初の理由です。CreateObject によって返される値をインスタンス化すると、奇跡的に他の理由も解決されます。が global_object に割り当てられている場合でも、同じ問題に遭遇します。global_object は戻り値のコピーになり、また、global_object と global_object->me は同じではなくなります。これが 2 番目の理由です。 >しかし、実際にはそこまではできません。CreateObject が $obj を返したら、参照を破棄します (行 34)。これが 3 番目の理由です。 2 つのオプションがあります。1 つは、例 6.22 (24、28、31、37 行目) のように、あらゆる場所にアンパサンドを追加することです。幸運にも PHP5 を使用できる場合は、これらすべての問題を PHP5 が自動的に考慮します。 PHP5 がこれらの問題をどのように考慮しているかを知りたい場合は、
リスト 6.22 PHP 4 の WTMA シンドロームを読み続けてください。
1 クラス MyFoo {
2 関数 MyFoo()
3 {
4 $this->me = &$this;
5 $this->value = 2;
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 ->値;
21 }
22 };
23
24 function &CreateObject($class_type)
25 {
26 switch ($class_type) {
27 case "foo":
28 $obj =& new MyFoo();
29 ブレーク;
30 case "バー":
31 $obj =& new MyBar(); ;
33 }
34 $obj を返します
35 }
36
37 $global_obj =& CreateObject ("foo");
38 $global_obj->setValue(7);
39
40 print "値は $global_obj- >getValue() . "n";
41 print "Value is " . $global_obj->getValueFromMe() . "n";ユーザーの視点から見ると、これは非常に明らかです。PHP5 では、オブジェクトは常に参照によって渡されますが、他のタイプのデータ (整数、文字列、配列など) は値によって渡されます。最も注目すべき点は、& を使用する必要がないことです。
オブジェクト指向プログラミングでは、オブジェクト ネットワークとオブジェクト間の複雑な関係が広範囲に使用されますが、以前のバージョンの PHP では、そのすべてで参照を使用する必要がありました。したがって、参照によるオブジェクトの移動がデフォルトで使用され、コピーが明示的に要求された場合にのみオブジェクトがコピーされます。これは以前よりも優れています。
どのように実装されていますか?
PHP5 より前では、すべての値は zval (Zend Value) と呼ばれる特別な構造体に格納されていました。これらの値は、数値や文字列などの単純な値、または配列やオブジェクトなどの複雑な値に格納されていました。 value 関数に渡されるとき、または関数から返されるときに、これらの値はコピーされ、メモリ内の別のアドレスに同じ内容の構造体が作成されます。
PHP5 では、値は引き続き zval 構造体に格納されます。ただし、オブジェクトはオブジェクトストアと呼ばれる構造体に存在し、それぞれのオブジェクトは異なるIDを持ちます。Zvalでは、オブジェクトを保持するzval構造体をコピーするときに、オブジェクト自体は格納されません。たとえば、オブジェクトを関数にパラメータとして渡すことにより、データはコピーされません。同じオブジェクト ポインタを保持し、そのオブジェクトが現在指しているオブジェクト ストアに別の zval を通知させます。それ自体はオブジェクト ストアにあり、変更はオブジェクトへのポインターを保持するすべての zval 構造に影響します。この追加の間接化により、PHP オブジェクトは常に透過的かつ効率的な方法で参照によって渡されるように見えます。
PHP5 を使用して、例 6.21 に戻ってすべてのアンパサンドを削除すると、コンストラクターで参照を保持するときに、アンパサンドが 1 つも使用されずに問題なく動作します (

ホット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)

ホットトピック









従来のコンピューティングを超える能力を備えているだけでなく、より低コストでより効率的なパフォーマンスを実現する人工知能モデルを想像してみてください。これは SF ではありません。世界で最も強力なオープンソース MoE モデルである DeepSeek-V2[1] が登場しました。 DeepSeek-V2 は、経済的なトレーニングと効率的な推論の特徴を備えた強力な専門家混合 (MoE) 言語モデルです。これは 236B のパラメータで構成されており、そのうち 21B は各マーカーをアクティブにするために使用されます。 DeepSeek67B と比較して、DeepSeek-V2 はパフォーマンスが優れていると同時に、トレーニング コストを 42.5% 節約し、KV キャッシュを 93.3% 削減し、最大生成スループットを 5.76 倍に高めます。 DeepSeek は一般的な人工知能を研究する会社です

AI は確かに数学を変えつつあります。最近、この問題に細心の注意を払っている陶哲軒氏が『米国数学協会会報』(米国数学協会会報)の最新号を送ってくれた。 「機械は数学を変えるのか?」というテーマを中心に、多くの数学者が意見を述べ、そのプロセス全体は火花に満ち、ハードコアで刺激的でした。著者には、フィールズ賞受賞者のアクシャイ・ベンカテシュ氏、中国の数学者鄭楽軍氏、ニューヨーク大学のコンピューター科学者アーネスト・デイビス氏、その他業界で著名な学者を含む強力な顔ぶれが揃っている。 AI の世界は劇的に変化しています。これらの記事の多くは 1 年前に投稿されたものです。

Google が推進する JAX のパフォーマンスは、最近のベンチマーク テストで Pytorch や TensorFlow のパフォーマンスを上回り、7 つの指標で 1 位にランクされました。また、テストは最高の JAX パフォーマンスを備えた TPU では行われませんでした。ただし、開発者の間では、依然として Tensorflow よりも Pytorch の方が人気があります。しかし、将来的には、おそらくより大規模なモデルが JAX プラットフォームに基づいてトレーニングされ、実行されるようになるでしょう。モデル 最近、Keras チームは、ネイティブ PyTorch 実装を使用して 3 つのバックエンド (TensorFlow、JAX、PyTorch) をベンチマークし、TensorFlow を使用して Keras2 をベンチマークしました。まず、主流のセットを選択します

Boston Dynamics Atlas は正式に電動ロボットの時代に突入します!昨日、油圧式アトラスが歴史の舞台から「涙ながらに」撤退したばかりですが、今日、ボストン・ダイナミクスは電動式アトラスが稼働することを発表しました。ボストン・ダイナミクス社は商用人型ロボットの分野でテスラ社と競争する決意を持っているようだ。新しいビデオが公開されてから、わずか 10 時間ですでに 100 万人以上が視聴しました。古い人が去り、新しい役割が現れるのは歴史的な必然です。今年が人型ロボットの爆発的な年であることは間違いありません。ネットユーザーは「ロボットの進歩により、今年の開会式は人間のように見え、人間よりもはるかに自由度が高い。しかし、これは本当にホラー映画ではないのか?」とコメントした。ビデオの冒頭では、アトラスは仰向けに見えるように地面に静かに横たわっています。次に続くのは驚くべきことです

今月初め、MIT やその他の機関の研究者らは、MLP に代わる非常に有望な代替案である KAN を提案しました。 KAN は、精度と解釈可能性の点で MLP よりも優れています。また、非常に少数のパラメーターを使用して、多数のパラメーターを使用して実行する MLP よりも優れたパフォーマンスを発揮できます。たとえば、著者らは、KAN を使用して、より小規模なネットワークと高度な自動化で DeepMind の結果を再現したと述べています。具体的には、DeepMind の MLP には約 300,000 個のパラメーターがありますが、KAN には約 200 個のパラメーターしかありません。 KAN は、MLP が普遍近似定理に基づいているのに対し、KAN はコルモゴロフ-アーノルド表現定理に基づいているのと同様に、強力な数学的基礎を持っています。以下の図に示すように、KAN は

テスラのロボット「オプティマス」の最新映像が公開され、すでに工場内で稼働可能となっている。通常の速度では、バッテリー(テスラの4680バッテリー)を次のように分類します:公式は、20倍の速度でどのように見えるかも公開しました - 小さな「ワークステーション」上で、ピッキング、ピッキング、ピッキング:今回は、それがリリースされたハイライトの1つビデオの内容は、オプティマスが工場内でこの作業を完全に自律的に行い、プロセス全体を通じて人間の介入なしに完了するというものです。そして、オプティマスの観点から見ると、自動エラー修正に重点を置いて、曲がったバッテリーを拾い上げたり配置したりすることもできます。オプティマスのハンドについては、NVIDIA の科学者ジム ファン氏が高く評価しました。オプティマスのハンドは、世界の 5 本指ロボットの 1 つです。最も器用。その手は触覚だけではありません

目標検出は自動運転システムにおいて比較的成熟した問題であり、その中でも歩行者検出は最も初期に導入されたアルゴリズムの 1 つです。ほとんどの論文では非常に包括的な研究が行われています。ただし、サラウンドビューに魚眼カメラを使用した距離認識については、あまり研究されていません。放射状の歪みが大きいため、標準のバウンディング ボックス表現を魚眼カメラに実装するのは困難です。上記の説明を軽減するために、拡張バウンディング ボックス、楕円、および一般的な多角形の設計を極/角度表現に探索し、これらの表現を分析するためのインスタンス セグメンテーション mIOU メトリックを定義します。提案された多角形モデルの FisheyeDetNet は、他のモデルよりも優れたパフォーマンスを示し、同時に自動運転用の Valeo 魚眼カメラ データセットで 49.5% の mAP を達成しました。

前に書かれたプロジェクトのリンク: https://nianticlabs.github.io/mickey/ 2 枚の写真が与えられた場合、それらの写真間の対応関係を確立することで、それらの間のカメラのポーズを推定できます。通常、これらの対応は 2D 対 2D であり、推定されたポーズはスケール不定です。いつでもどこでもインスタント拡張現実などの一部のアプリケーションでは、スケール メトリクスの姿勢推定が必要なため、スケールを回復するために外部深度推定器に依存します。この論文では、3D カメラ空間でのメトリックの対応を予測できるキーポイント マッチング プロセスである MicKey を提案します。画像全体の 3D 座標マッチングを学習することで、相対的なメトリックを推測できるようになります。
