検索
ホームページウェブフロントエンドjsチュートリアルBackbone.js 0.9.2 ソースコード解説 中国語翻訳版_基礎知識

// バックボーン.js 0.9.2

 

// (c) 2010-2012 Jeremy Ashkenas、DocumentCloud Inc.

// バックボーンは MIT ライセンスに基づいて自由に配布できます。

// すべての詳細とドキュメントについては:

// http://backbonejs.org

(関数() {

 

  // グローバル オブジェクトを作成します。ブラウザではウィンドウ オブジェクトとして表され、Node.js ではグローバル オブジェクトとして表されます。

  var root = これ;

 

  // 「Backbone」変数の値が上書きされる前に保存します。

  // 名前の競合がある場合、または仕様を考慮している場合は、Backbone.noConflict() メソッドを使用して、Backbone によって占有される前の変数の値を復元し、名前変更のために Backbone オブジェクトを返すことができます。

  varPreviousBackbone = root.Backbone;

 

  // Array.prototype のスライス メソッドとスプライス メソッドを呼び出し用のローカル変数にキャッシュします

  var スライス = Array.prototype.slice;

  var splice = Array.prototype.splice;

 

  var バックボーン;

  if( typeof エクスポート !== '未定義') {

    バックボーン = 輸出。

  } それ以外 {

    バックボーン = root.バックボーン = {};

  }

 

  //バックボーンのバージョンを定義

  バックボーン.VERSION = '0.9.2';

 

  // サーバー環境に Underscore を自動的にインポートします。Backbone の一部のメソッドは Underscore に依存するか、Underscore から継承します。

  var _ = root._;

  if(!_ && ( typeof require !== '未定義'))

    _ = require('アンダースコア');

 

  // サードパーティ ライブラリを統一変数 "$" として定義します。これは、表示 (View)、イベント処理、およびサーバー データとの同期 (sync) 中にライブラリ内のメソッドを呼び出すために使用されます。

  // サポートされているライブラリには jQuery、Zepto などが含まれます。これらは同じ構文を持ちますが、Zepto は主に Webkit コア ブラウザーを対象としています。

  // Backbone で使用するために、jQuery に似た構文を使用してカスタム ライブラリをカスタマイズすることもできます (jQuery や Zepto よりも軽いカスタマイズされたバージョンが必要になる場合があります)

  // ここで定義された「$」はローカル変数であるため、Backbone フレームワーク外のサードパーティ ライブラリの通常の使用には影響しません。

  var $ = root.jQuery || root.Zepto || root.ender;

 

  // サードパーティのライブラリを手動でセットアップする

  // Backbone をインポートする前にサードパーティのライブラリをインポートしていない場合は、setDomLibrary メソッドを通じて "$" ローカル変数を設定できます

  // setDomLibrary メソッドは、Backbone にカスタム ライブラリを動的にインポートするためにもよく使用されます。

  Backbone.setDomLibrary = function(lib) {

    $ = ライブラリ;

  };

  //「Backbone」の後のフレームワークの名前付けを放棄し、Backbone オブジェクトを返します。通常、名前の競合を回避したり、名前付け方法を標準化するために使用されます。

  // 例えば:

  // var bk = Backbone.noConflict(); // 「Backbone」の命名をキャンセルし、Backbone オブジェクトを bk 変数に格納します

  // console.log(Backbone); // この変数は Backbone オブジェクトにアクセスできなくなり、Backbone が定義される前の値に復元されます。

  // var MyBackbone = bk; // bk は Backbone オブジェクトを保存します。名前を MyBackbone に変更します。

  Backbone.noConflict = function() {

    root.Backbone = 前のバックボーン;

    これを返します。

  };

  // REST をサポートしていないブラウザの場合は、Backbone.emulateHTTP = true を設定できます。

  // サーバー リクエストは POST モードで送信され、オペレーション名を識別するために _method パラメーターがデータに追加され、X-HTTP-Method-Override ヘッダー情報も送信されます。

  Backbone.emulateHTTP = false;

 

  // application/json エンコードをサポートしていないブラウザの場合は、Backbone.emulateJSON = true に設定できます。

  // リクエスト タイプを application/x-www-form-urlencoded に設定し、互換性を確保するためにデータをモデル パラメータに配置します

  Backbone.emulateJSON = false;

 

  // カスタム イベントに関連する Backbone.Events

  // ------------------

 

  //eventSplitter は、複数のイベントを処理するときのイベント名の解析ルールを指定します。

  vareventSplitter = /s /;

 

  // カスタム イベント マネージャー

  // オブジェクト内のイベント関連メソッドをバインドすることで、オブジェクトへのカスタム イベントの追加、削除、トリガーが可能になります。

  var イベント = バックボーン.イベント = {

 

    // カスタム イベントとコールバック関数を現在のオブジェクトにバインドします

    // コールバック関数内のコンテキスト オブジェクトは、指定されたコンテキストです。コンテキストが設定されていない場合、コンテキスト オブジェクトはデフォルトで現在バインドされているイベントのオブジェクトになります。

    // このメソッドは、DOM Level2 の addEventListener メソッドに似ています。

    // events では、空白文字 (スペース、タブなど) で区切って複数のイベント名を指定できます。

    // イベント名が「all」の場合、トリガーメソッドの呼び出しによってイベントがトリガーされると、「all」イベントにバインドされているすべてのコールバック関数が呼び出されます。

    on : function(イベント、コールバック、コンテキスト) {

      //一部の関数で使用されるローカル変数を定義します

      var 呼び出し、イベント、ノード、テール、リスト。

      //コールバック関数を設定する必要があります

      if(!コールバック)

        これを返します。

      //eventSplitter を通じてイベント名を解析し、split を使用して複数のイベント名を配列に分割します

      // 複数のイベント名を指定するには、通常は空白文字を使用します

      events = events.split(eventSplitter);

      // 現在のオブジェクトにバインドされているイベントとコールバック関数のリストを記録する呼び出し

      呼び出し = this._callbacks || (this._callbacks = {});

 

      // イベント名のリストをループし、最初から最後までイベント名をイベント変数に保存します。

      while( イベント = events.shift()) {

        // イベントイベントにバインドされたコールバック関数を取得します

        // list には、単一のイベント名にバインドされたコールバック関数のリストが格納されます。

        // 関数リストは配列に格納されませんが、複数のオブジェクトの次の属性を通じて順次関連付けられます。

        /**データ格式のような:

         * {

         * 末尾: {オブジェクト}、

         *   次: {

         * コールバック: {関数}、

         * コンテキスト: {オブジェクト}、

         *     次: {

         * コールバック: {関数}、

         * コンテキスト: {オブジェクト}、

         * 次へ: {オブジェクト}

         * }

         * }

         * }*/

        // リストの各レベルの次のオブジェクトには、コールバック イベント (関数本体、コンテキスト、次のコールバック イベント) に関連する情報が格納されます。

        // イベント リストの最上位には末尾オブジェクトが格納され、最後にバインドされたコールバック イベントの識別子 (最後のコールバック イベントの次のオブジェクトと同じオブジェクト) が格納されます。

        // テール識別子を通じて、コールバック リストを走査するときに最後のコールバック関数に到達したことがわかります

        リスト = 呼び出し[イベント];

        // ノード変数は、このコールバック関数に関連する情報を記録するために使用されます。

        //tail は最後にバインドされたコールバック関数の識別子のみを保存します

        // したがって、コールバック関数が以前にバインドされている場合は、前のテールをオブジェクトとしてノードに割り当ててから、テールの新しいオブジェクト識別子を作成します

        // このコールバック イベントが前のコールバックの末尾オブジェクトに追加される理由は、コールバック関数リストのオブジェクト階層をバインド順に配置するためです (最新のバインドされたイベントが最後に配置されます)

        ノード = リスト ? list.tail : {};

        ノード.ネクスト = テール = {};

        //このコールバックの関数本体とコンテキスト情報を記録します

        ノード.コンテキスト = コンテキスト;

        ノード.コールバック = コールバック;

        // 現在のイベントのコールバック リストを再構築します。このコールバック イベントはリストに追加されています

        呼び出し[イベント] = {

          尾: 尾、

          次: リスト list.next: ノード

        };

      }

      // メソッドチェーンの呼び出しを容易にするために現在のオブジェクトを返します

      これを返します。

    }、

    // オブジェクト内のバインドされたイベントまたはコールバック関数を削除します。イベント、コールバック、およびコンテキストを通じて、削除する必要があるイベントまたはコールバック関数をフィルターできます。

    // - コンテキストが空の場合、コールバックで指定されたすべての関数を削除します

    // - コールバックが空の場合、イベント内のすべてのコールバック関数を削除します

    // - イベントが空で、コールバックまたはコンテキストが指定されている場合、コールバックまたはコンテキストで指定されたコールバック関数を削除します (イベント名は区別されません)

    // - パラメータが渡されない場合は、オブジェクトにバインドされているすべてのイベントとコールバック関数を削除します

    オフ: 関数(イベント、コールバック、コンテキスト) {

      var イベント、コール、ノード、テール、cb、ctx;

 

      // イベントがない、または *すべて* のイベントを削除します。

      // 現在のオブジェクトにはイベントがバインドされていません

      if(!( call = this._callbacks))

        戻る;

      // パラメーターが指定されていない場合は、すべてのイベントとコールバック関数を削除します (_callbacks 属性を削除します)。

      if(!(イベント || コールバック || コンテキスト)) {

        this._callbacks を削除します。

        これを返します。

      }

 

      // 削除する必要があるイベント リストを解析します

      // - イベントが指定されている場合、イベント名はeventSplitterに従って解析されます。

      // - イベントが指定されていない場合は、バインドされたすべてのイベントの名前リストを解析します

      イベント = イベント ? events.split(eventSplitter) : _.keys(calls);

 

      // ループイベント名リスト

      while( イベント = events.shift()) {

        // 現在のイベント オブジェクトをリストから削除し、ノード変数にキャッシュします。

        ノード = 呼び出し[イベント];

        通話を削除[イベント];

        // 現在のイベント オブジェクトが存在しない場合 (または削除フィルター条件が指定されていない場合、現在のイベントとすべてのコールバック関数が削除されるとみなされます)、この操作を終了します (イベント オブジェクトは前のステップで削除されています) )

        if(!ノード || !(コールバック || コンテキスト))

          続く;

        // 指定されたコールバックを省略して、新しいリストを作成します。

        // コールバック関数またはコンテキストフィルターの条件に従って、新しいイベントオブジェクトをアセンブルし、再バインドします

        テール = ノード.テール;

        // イベント内のすべてのコールバック オブジェクトを走査します

        while(( ノード = ノード.ネクスト) !== テール) {

          cb = ノード.コールバック;

          ctx = ノード.コンテキスト;

          // パラメーター内のコールバック関数とコンテキストに基づいて、コールバック関数をフィルターし、フィルター条件を満たさないコールバック関数をイベントに再バインドします (イベント内のすべてのコールバック関数が上記で削除されているため)

          if((コールバック && cb !== コールバック) || (コンテキスト && ctx !== コンテキスト)) {

            this.on(イベント、cb、ctx);

          }

        }

      }

 

      これを返します。

    }、

    // 定義されている 1 つ以上のイベントをトリガーし、バインドされたコールバック関数リストを順番に実行します。

    トリガー : 関数(イベント) {

      var イベント、ノード、呼び出し、末尾、引数、すべて、残り。

      // 現在のオブジェクトにはイベントがバインドされていません

      if(!( call = this._callbacks))

        これを返します。

      // コールバック関数リストにバインドされている「すべて」のイベント リストを取得します

      すべて = 呼び出し.すべて;

      // EventSplitter ルールに従って、配列にトリガーする必要があるイベント名を解析します。

      events = events.split(eventSplitter);

      // トリガーのパラメーターを 2 番目から REST 変数に記録し、順番にコールバック関数に渡します。

      残り = スライス.コール(引数, 1);

 

      // トリガーする必要があるイベントのリストをループします

      while( イベント = events.shift()) {

        // ここのノード変数は、現在のイベントのすべてのコールバック関数のリストを記録します。

        if( ノード = 呼び出し[イベント]) {

          //tail 変数は、最後のバインディング イベントのオブジェクト ID を記録します。

          テール = ノード.テール;

          //ノード変数の値は、イベントのバインド順序に従って、バインドされた単一のコールバック イベント オブジェクトに順番に割り当てられます。

          // 最後にバインドされたイベントの next プロパティは、tail と同じオブジェクトを参照します。これは、リストの最後に到達したかどうかを判断するための基準として使用されます。

          while(( ノード = ノード.ネクスト) !== テール) {

            // すべてのバインドされたイベントを実行し、トリガーをコールバック関数に呼び出すときにパラメーターを渡します

            node.callback.apply(node.context || this,rest);

          }

        }

        // 変数 all はバインド中の「all」イベントを記録します。つまり、イベントが呼び出されると、「all」イベント内のコールバック関数が実行されます。

        // - 「all」イベント内のコールバック関数は、バインド順序に関係なく、現在のイベントのすべてのコールバック関数リストが実行された後に順次実行されます。

        // - 通常のイベントがトリガーされると、「all」イベントが自動的に呼び出されます。「all」イベントが強制的にトリガーされると、イベント内のコールバック関数が 2 回実行されます。

        if(ノード=すべて) {

          テール = ノード.テール;

          //通常のイベントのコールバック関数の呼び出しとの違いは、all イベントは現在呼び出されたイベント名を最初のパラメーターとしてコールバック関数に渡すことです。

          args = [イベント].concat(rest);

          // 「all」イベント内のコールバック関数リストをトラバースして実行します

          while(( ノード = ノード.ネクスト) !== テール) {

            node.callback.apply(node.context || this, args);

          }

        }

      }

 

      これを返します。

    }

  };

 

  // バックボーンの以前のバージョンとの互換性のための、バインディング イベントとリリース イベントのエイリアス

  イベント.バインド = イベント.on;

  イベント.アンバインド = イベント.オフ;

 

  // Backbone.Model データ オブジェクト モデル

  //---------------

 

  // Model は Backbone のすべてのデータ オブジェクト モデルの基本クラスであり、データ モデルの作成に使用されます

  // @param {Object} 属性はモデル作成時の初期化データを指定します

  // @param {オブジェクト} オプション

  /*** @format オプション

   * {

   * 解析: {ブール値}、

   * コレクション: {コレクション}

   * }*/

  var Model = Backbone.Model = function(属性, オプション) {

    // デフォルト変数はモデルのデフォルト データを保存するために使用されます

    var のデフォルト。

    // 属性パラメータが指定されていない場合は、属性を空のオブジェクトに設定します

    属性 || ( 属性 = {});

    // 属性のデフォルト データの解析方法を設定します。たとえば、デフォルト データは、設定されたメソッドで必要なデータ形式と互換性があるように、サーバーから取得されます。メソッドを解析に使用できます。

    if(オプション && オプション.parse)

      属性 = this.parse(属性);

    if( デフォルト = getValue(this, 'デフォルト')) {

      // モデルの定義時にデフォルト データを設定する場合、初期化データはデフォルトと属性パラメータとマージされたデータを使用します (属性のデータはデフォルトの同じ名前のデータを上書きします)

      属性 = _.extend({}, デフォルト, 属性);

    }

    // モデルが属する Collection オブジェクトを明示的に指定します (Collection の add、push などのメソッドを呼び出してモデルをコレクションに追加すると、モデルが属する Collection オブジェクトが自動的に設定されます)

    if(オプション && オプション.コレクション)

      this.collection = オプション.コレクション;

    //attributes 属性には、現在のモデルの JSON オブジェクト化データが格納され、モデル作成時のデフォルトでは空です。

    this.attributes = {};

    // エスケープ メソッドを通じて処理されたデータをキャッシュする _escapedAttributes キャッシュ オブジェクトを定義します。

    this._escapedAttributes = {};

    // 各モデルに一意の識別子を設定します

    this.cid = _.uniqueId('c');

    //データのステータスを記録するために使用される一連のオブジェクトを定義します。具体的な意味については、オブジェクトを定義する際のコメントを参照してください。

    this.changed = {};

    this._silent = {};

    this._pending = {};

    // インスタンスの作成時に初期化データを設定します。初めてサイレント パラメーターを使用すると、変更イベントはトリガーされません。

    this.set(属性, {

      サイレント : true

    });

    // 初期化データは上で設定されています。変更されたオブジェクト、_silent、_pending オブジェクトのステータスが変更されている可能性があります。ここで再初期化します。

    this.changed = {};

    this._silent = {};

    this._pending = {};

    // _previousAttributes 変数にはモデル データのコピーが保存されます

    // 変更イベントでモデルデータが変更される前の状態を取得するために使用されます。以前の状態のデータは、previous メソッドまたはpreviousAttributes メソッドを通じて取得できます。

    this._previousAttributes = _.clone(this.attributes);

    //initialize初期化メソッドを呼び出す

    this.initialize.apply(this, 引数);

  };

  // extend メソッドを使用して、Model プロトタイプの一連のプロパティとメソッドを定義します。

  _.extend(Model.prototype, イベント, {

 

    //変更された属性は、set メソッドが呼び出されるたびに、変更されたデータのキー コレクションを記録します。

    変更されました: null、

 

    // // サイレント属性が指定されている場合、変更イベントはトリガーされず、次の変更イベントがトリガーされるまで変更されたデータが記録されます。

    // _silent 属性は、サイレントの使用時に変更されたデータを記録するために使用されます

    _silent : null、

 

    _pending : null、

 

    // 各モデルの一意の識別属性 (デフォルトは「id」、id 属性名は idAttribute を変更することでカスタマイズできます)

    // データの設定時に id 属性が含まれている場合、その ID はモデルの ID をオーバーライドします。

    // ID は、コレクション内のモデルを検索して識別するために使用されます。バックエンド インターフェイスと通信する場合、ID はレコードの識別子としても使用されます。

    id属性: 'id',

 

    // モデル初期化メソッド。モデルの構築後に自動的に呼び出されます。

    初期化: function() {

    }、

    // 現在のモデルのデータのコピーを返します (JSON オブジェクト形式)

    toJSON : 関数(オプション) {

      return _.clone(this.attributes);

    }、

    // attr 属性名に従って、モデル内のデータ値を取得します

    get : function(attr) {

      this.attributes[attr] を返します。

    }、

    //attr 属性名に従って、データ値に含まれる HTML 特殊文字が & 
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SecLists

SecLists

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境