大家 题 このテーマを見れば、今日私が話しているのは PHP の変数参照機能であることは誰でもわかりますが、遅延代入とは何でしょうか?これは主に最近いくつかの機能を最適化する際に思いついたアイデアですが、かなり良いと思うので記録する予定です。以下の疑似コードを見てください:
// 这段代码有人会说为啥不用联表,因为有些业务需求不用联表的效率是联表的3到20倍// 我的项目里基本都是此类写法,比之前联表效率提升很多$a = DB::query("select id from a");$aid = "";foreach($a as $v){ $aid .= $v['id'].','; }$aid = substr($aid, 0 , -1);if($aid){ $b = DB::query("select * from b where aid in ({$aid})"); // 此处省略}
このコードを例として使用します。これに似たコードが多数あるため、誰でも理解しやすいですが、遅延後の割り当てには必ずしも適しているわけではありません。これは、より寛容であり、効率も同様であるためです。ただし、後の遅延割り当てとははっきりと対照的であり、次の実装方法を誰でも理解しやすくなります。
上記の例を読んだ後、必要なデータとして、ある人の最新 10 件の記事のリストを取得し、各記事に対して 5 つのコメントを読み取り、記事の ID と名前を含めることです。イニシエーターとコメンテーターは、クライアントに指定された形式の JSON に戻ります。以下のコードを参照してください。先頭のコメント '] 変数 $commentList が後で $commentList の値に変更され、これに応じて $data[]['comment'] の値も変更されます。これも後の段階での遅延割り当てです。 , しかし、これに基づいて実装原理について学ぶことができます。
ほとんどの人が同様のコードを書いたことがあると思いますが、このコードに問題があると考える人はほとんどいません。この部分のロジックを分析してみましょう。各記事は 5 つのコメント情報を取得する必要があるため、単純な SQL を使用して 1 つにマージすることはできません。要件は 10 件の記事を取得することだけなので、複雑な SQL 処理を記述するのはループ クエリほど効率的ではありません。 (イントラネットのレイテンシが低い場合) 複雑な SQL の処理効率が遅いのはなぜですか? 数千個のデータを考慮している場合は特に注意する必要はありませんが、数千万個のデータを処理している場合は、複雑な SQL は多くの場合、単純な SQL ほど効率的ではないため、ここではループ クエリを使用して最適化を続けることはできません。しかし、ユーザー情報もループでクエリされることがわかり、これは非常に悪いことです。10 件の投稿がすべて 1 人によって開始され、50 件近くのコメントが大量に投稿されることは望ましくありません。アクティブなユーザー データ。ビジネス ロジックでは、重複したユーザー情報をクエリする可能性が非常に高いため、データベースから重複した情報を取得せず、再利用することが最善です。ユーザー情報はどのように再利用できますか?最終データを組み立てる前に記事のコメント情報を取得し、ユーザーIDを収集し、ユーザー情報を取得して最終データを組み立てるというループが可能です。これは比較的単純な解決策であり、今日は、割り当ての遅延に対処する洗練された方法を見てみましょう。
// 这种需求用联表获取用户信息远没有搜集用户id做in查询效率高$data = array();$article = DB::query("select id,uid,title,content from article where uid={$_GET['uid']} order by id desc limit 10");foreach($article as $v){ $uid = $v['uid']; $comment = DB::query("select id,uid,content from comment where aid={$v['id']} order by id asc limit 5"); foreach($comment as $value){ $uid .= ','.$value['uid']; } // 这里第二个参数我们要求DB类返回的数组以uid为索引 $member = DB::query("select uid,username from user where uid in({$uid})", 'uid'); $commentList = array(); $data[] = array( 'id' => $v['id'], 'title' => $v['title'], 'content' => $v['content'], 'uid' => $v['uid'], 'username' => $member[$v['uid']]['username'], 'comment' => &$commentList ); foreach($comment as $value){ $commentList[] = array( 'id' => $value['id'], 'content' => $value['content'], 'uid' => $value['uid'], 'username' => $member[$value['uid']]['username'] ) }} echo json_encode($data);exit;
このコードが以前と違うのは、一番下に余分なコードがあることですが、それが何の役にも立たないようです。まず、ループ内で記事データの前に変数 $member = array() が初期化され、その後、ループ内で $uid の割り当てが欠落し、コメント投稿者の ID がループ内で収集されます。また、ユーザーデータをクエリするための SQL もコードの下部にあるようです。注意深く検索したところ、&$member[$v['uid']]['username'] と &$member[$value['uid']]['username'] にはさらに & 参照記号があることがわかりました。なぜコードを書くという謎がループから抜け落ちているのか。 $commentList が参照されて後で割り当てられ、$data[]['comment'] が変更されたことを思い出してください。原理は同じです。最初にユーザー情報をクエリするのではなく、存在しない変数を参照する場合、PHP は最初に変数を作成します (例: &$member[$v['uid']][)。 ' username'] の場合、PHP は $member が配列であり宣言されていることを検出しますが、$member[$v['uid']]['username'] は存在せず、メモリ内に作成され、値は null です。
ループ後に記事データを印刷すると、ユーザー名情報がすべて null であることがわかります。もちろん、PHP が割り当てを参照するときにユーザー情報は使用されていませんでした。次に、 $uid = array_keys($member) を使用して、すべてのユーザーの ID 情報を取得します。
为什么array_keys能获取用户id,因为php在引用的时候帮我们创建了$member数组呀,注意一下这里的uid是不重复的哟,之后我们去user表用in检索用户信息,一定注意这里不能把返回的数据赋值给$member因为之前的数据都是引用$member里的数据,如果这里覆盖了$member,内存里两个变量的地址就不一样了,相当于重新创建了一个数组,我们这里赋值给$user,下面的循环是干什么的,当然是修改之前被引用数据的赋值了,我们循环$member变量把$user[$uid]['username']赋值给$member[$uid]['username'],从而改变引用变量的值。在我们把数据绑定到引用变量后千万不要忽略用uset把$member删除了,主要是防止之后的代码里出现操作$member变量的代码,不小心就会把之前绑定好的数据覆盖掉。为啥删除$member之后绑定的数据没有丢失,主要是引用的特性,当多个变量引用一个内存地址时,删除其中一个变量不影响其它变量,除非把所有变量都删除,才会真的删除内存里的数据。php手册是这么解释的“当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了”。unset($user);只是因为$user是一个临时变量,使用完可以直接从内存释放了。
关于这种编程方式我起名为后期数据延迟绑定,之所以标题是延迟变量赋值主要是让大家便于理解。Php中引用的作用非常广泛,本文所举的例子也只局部的一种使用方法,用来解决编程中遇到类似业务需求的一种处理方式,当然后期数据延迟绑定的编程方法也有很广的使用,希望大家不要局限在本文例子的场景上。针对本文例子是我们编程中最常用的一种问题,我编写了一个函数用来处理数据延迟绑定,减少每个地方都要编写数据绑定的逻辑。
/** * 数据延迟绑定通用方法 * * @access public * @param array $bindingVar 待绑定的变量 * @param array $data 待绑定的数据 * @param mixed $default 默认值 * @return void */function bindingData(&$bindingVar, $data, $default=''){ foreach($bindingVar as $key => $tmp){ foreach($tmp as $k => $v){ $bindingVar[$key][$k] = isset($data[$key][$k]) ? $data[$key][$k] : $default; } } unset($bindingVar);}
采用这个函数我们能把之前处理数据绑定的代码部分改成下面这样:
$uid = array_keys($member);if($uid){ $user = DB::query("select uid,username from user where uid in({$uid})", 'uid'); bindingData($member, $user); unset($member,$user);}

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

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

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

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