定義済みインターフェイスの深い理解
シナリオ: 通常の仕事では、ビジネス モジュールを作成しますが、To にアクセスすることはほとんどありません。このようなインターフェイスを実装すると、フレームワークでよく使用されます。
1. トラバーサル インターフェイス
このインターフェイスは、クラスによって直接実装することはできません。通常のクラスを直接記述してトラバーサルを実装する場合、インターフェイスは致命的なエラーを直接報告し、実装する Iterator (反復子インターフェイス) または IteratorAggregate (集約反復子インターフェイス) の使用を促します。これら 2 つのインターフェイスは後で紹介します。通常の状況では、クラスを判断するためにのみ使用します。 foreach を使用してトラバースすることは可能ですか?
class Test implements Traversable { } 上面这个是错误示范,该代码会提示这样的错误: Fatal error: Class Test must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0
上記は、大まかに言うと、このインターフェイスを実装したい場合は、Iterator または IteratorAggregate を使用して実装する必要があることを意味します
正しいアプローチ:
foreach を使用してクラスをトラバースできるかどうかを判断するには、それが traversable
class Test { } $test = new Test; var_dump($test instanceOf Traversable);
2 のインスタンスであるかどうかを判断するだけで済みます。デバイスインターフェイスの実際の実装原理はポインタの移動と同様で、クラスを記述する際に対応する key()、current()、next()、rewind()、valid() の 5 つのメソッドを実装できます。データの反復移動を実現するには、詳細については次のコードを参照してください
<?php class Test implements Iterator { private $key; private $val = [ 'one', 'two', 'three', ]; public function key() { return $this->key; } public function current() { return $this->val[$this->key]; } public function next() { ++$this->key; } public function rewind() { $this->key = 0; } public function valid() { return isset($this->val[$this->key]); } } $test = new Test; $test->rewind(); while($test->valid()) { echo $test->key . ':' . $test->current() . PHP_EOL; $test->next(); }## 出力結果:
0: one 1: two 2: threeこの原理を確認すると、実際の反復移動方法がわかります。は: rewind()-> valid()->key() -> current() -> next() -> valid()-> key() ....-> valid( ); さて、上記を理解した後、Iterator インターフェイスを開くと、Traversable インターフェイスが実装されていることがわかります。次に、それを証明しましょう:
var_dump($test instanceOf Traversable);結果は true を返し、このクラスのオブジェクトは横断可能です。
foreach ($test as $key => $value){ echo $test->key . ':' . $test->current() . PHP_EOL; }この結果は、while ループによって実装されたパターンと同じになります。
3. IteratorAggregate (集約反復子) インターフェイス
集約反復子と反復子の原理は同じですが、集約反復子はすでに反復子の原則を実装しています。反復を実装するには getIterator() メソッドを実装するだけで済みます。詳細については、次のコードを参照してください。
<?php class Test implements IteratorAggregate { public $one = 1; public $two = 2; public $three = 3; public function __construct() { $this->four = 4; } public function getIterator() { return new AraayIterator($this); } } $test = (new Test())->getIterator(); $test->rewind(); while($test->valid()) { echo $test->key() . ' : ' . $test->current() . PHP_EOL; $test->next(); } 从上面的代码,我们可以看到我们将Test类的对象传进去当做迭代器,通过while循环的话,我们必须通过调用getIterator()方法获取到迭代器对象,然后直接进行迭代输出,而不需要去实现相关的key()等方法。 当然这个时候,我们肯定想知道是否可以直接从foreach进行迭代循环出去呢?那么我们来打印一下结果 $test = new Test; var_dump($test instanceOf Traversable); 结果是输出bool true,所以我们接下来是直接用foreach来实现一下。 $test = new Test; foreach($test as $key => $value) { echo $key . ' : ' . $value . PHP_EOL; } 接下来,我们看到是对对象进行迭代,这个时候我们是否可以数组进行迭代呢? class Test implements IteratorAggregate { public $data; public function __construct() { $this->data = [''one' => 1 , 'two' => 2]; } public function getIterator() { return new AraayIterator($this->data); } } 同理实现的方式跟对对象进行迭代是一样的。多くの PHPer は、次のような場合に高度です。常に何らかの問題とボトルネックが存在します。ビジネス コードを書きすぎて、方向性がわかりません。どこから改善を始めればよいかわかりません。分散アーキテクチャ、高いスケーラビリティ、高い同時実行性、サーバー パフォーマンス チューニング、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql 最適化、シェル スクリプト、Docker、マイクロサービス、Nginx、その他多くの知識ポイント。高度な知識が必要な場合は、全員、グループに参加する必要がある場合は (→をクリック) 677079770
4. ArrayAccess (アレイ アクセス) インターフェイス
通常は、この ['name '] を参照してください。このような使用法ですが、$this がオブジェクトであることはわかっています。配列メソッドを使用してそれにアクセスするにはどうすればよいでしょうか?答えは、データ グループ アクセス インターフェイス ArrayAccess を実装することです。具体的なコードは次のとおりです。
<?php class Test implements ArrayAccess { public $container; public function __construct() { $this->container = [ 'one' => 1, 'two' => 2, 'three' => 3, ]; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } public function offsetUnset($offset) { unset($this->container[$offset]); } } $test = new Test; var_dump(isset($test['one'])); var_dump($test['two']); unset($test['two']); var_dump(isset($test['two'])); $test['two'] = 22; var_dump($test['two']); $test[] = 4; var_dump($test); var_dump($test[0]); 当然我们也有经典的一个做法就是把对象的属性当做数组来访问 class Test implements ArrayAccess { public $name; public function __construct() { $this->name = 'gabe'; } public function offsetExists($offset) { return isset($this->$offset); } public function offsetGet($offset) { return isset($this->$offset) ? $this->$offset : null; } public function offsetSet($offset, $value) { $this->$offset = $value; } public function offsetUnset($offset) { unset($this->$offset); } } $test = new Test; var_dump(isset($test['name'])); var_dump($test['name']); var_dump($test['age']); $test[1] = '22'; var_dump($test); unset($test['name']); var_dump(isset($test['name'])); var_dump($test); $test[] = 'hello world'; var_dump($test);
5. シリアル化可能 (シリアル化) インターフェイス
通常、クラスにマジック メソッド sleep() と wakeup () が定義されている場合、() をシリアル化するときに、最初にマジック メソッド sleep() を呼び出します。オブジェクトのどのプロパティがプロパティであるかを定義する配列を返します。同様に、unserialize() メソッドを呼び出すときは、最初に wakeup() マジック メソッドも呼び出します。オブジェクトのプロパティに値を割り当てるなどの初期化を行うことができますが、このクラスがシリアル化インターフェイスを実装している場合, そのため、serialize() メソッドと unserialize() メソッドを実装する必要があります。同時に、2 つのマジック メソッド sleep() と wakeup () は同時にサポートされなくなります。具体的なコードは次のとおりです。 ##<?php
class Test
{
public $name;
public $age;
public function __construct()
{
$this->name = 'gabe';
$this->age = 25;
}
public function __wakeup()
{
var_dump(__METHOD__);
$this->age++;
}
public function __sleep()
{
var_dump(__METHOD__);
return ['name'];
}
}
$test = new Test;
$a = serialize($test);
var_dump($a);
var_dump(unserialize($a));
//实现序列化接口,发现魔术方法失效了
class Test implements Serializable
{
public $name;
public $age;
public function __construct()
{
$this->name = 'gabe';
$this->age = 25;
}
public function __wakeup()
{
var_dump(__METHOD__);
$this->age++;
}
public function __sleep()
{
var_dump(__METHOD__);
return ['name'];
}
public function serialize()
{
return serialize($this->name);
}
public function unserialize($serialized)
{
$this->name = unserialize($serialized);
$this->age = 1;
}
}
$test = new Test;
$a = serialize($test);
var_dump($a);
var_dump(unserialize($a));
は、匿名関数を表すために使用されるクラスであり、すべての匿名関数は実際に Closure クロージャ クラスのインスタンスを返します。このクラスには、bindTo() と binding() という 2 つの主要なメソッドがあります。ソース コードを見ると、2 つのメソッドの目的は同じであることがわかりますが、bind() は静的メソッドです。具体的な使用方法は次のとおりです。 ; <?php
$closure = function () {
return 'hello world';
}
var_dump($closure);
var_dump($closure());
上記の例を通して、最初に出力されるものは Closure のインスタンスであり、2 番目のものは匿名関数によって返された hello world 文字列を出力することがわかります。次のステップは、この匿名クラスのメソッドを使用することです。これら 2 つのメソッドの目的は、匿名関数をクラスにバインドすることです;
bindTo()
<?php namespace demo1; class Test { private $name = 'hello woeld'; } $closure = function () { return $this->name; } $func = $closure->bindTo(new Test); $func(); // 这个是可以访问不到私有属性的,会报出无法访问私有属性 // 下面这个是正确的做法 $func = $closure->bindTo(new Test, Test::class); $func(); namespace demo2; class Test { private statis $name = 'hello world'; } $closure = function () { return self::$name; } $func = $closure->bindTo(null, Test::class); $func();
bind ()
<?php namespace demo1; class Test { private $name = 'hello world'; } $func = \Closure::bind(function() { return $this->name; }, new Test, Test::class); $func(); namespace demo2; class Test { private static $name = 'hello world'; } $func = \Closure::bind(function() { return self::$name; }, null, Test::class); $func()
7. ジェネレーター
Generator 实现了 Iterator,但是他无法被继承,同时也生成实例。既然实现了 Iterator,所以正如上文所介绍,他也就有了和 Iterator 相同的功能:rewind->valid->current->key->next...,Generator 的语法主要来自于关键字 yield。yield 就好比一次循环的中转站,记录本次的活动轨迹,返回一个 Generator 的实例。
Generator 的优点在于,当我们要使用到大数据的遍历,或者说大文件的读写,而我们的内存不够的情况下,能够极大的减少我们对于内存的消耗,因为传统的遍历会返回所有的数据,这个数据存在内存上,而 yield 只会返回当前的值,不过当我们在使用 yield 时,其实其中会有一个处理记忆体的过程,所以实际上这是一个用时间换空间的办法。
<?php $start_time = microtime(true); function xrange(int $num){ for($i = 0; $i < $num; $i++) { yield $i; } } $generator = xrange(100000); foreach ($generator as $key => $value) { echo $key . ': ' . $value . PHP_EOL; } echo 'memory: ' . memory_get_usage() . ' time: '. (microtime(true) - $start_time);
输出:memory: 388904 time: 0.12135100364685
<?php $start_time = microtime(true); function xrange(int $num){ $arr = []; for($i = 0; $i < $num; $i++) { array_push($arr, $i); } return $arr; } $arr = xrange(100000); foreach ($arr as $key => $value) { echo $key . ': ' . $value . PHP_EOL; } echo 'memory: ' . memory_get_usage() . ' time: '. (microtime(true) - $start_time);
输出:
memory: 6680312 time: 0.10804104804993
更多相关php知识,请访问php教程!
以上がPHP の 7 つの事前定義インターフェースについての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

PHPでのユーザーセッションアクティビティの追跡は、セッション管理を通じて実装されます。 1)SESSION_START()を使用してセッションを開始します。 2)$ _Sessionアレイを介してデータを保存およびアクセスします。 3)セッションを終了するには、session_destroy()を呼び出します。セッショントラッキングは、ユーザーの動作分析、セキュリティ監視、パフォーマンスの最適化に使用されます。

データベースを使用してPHPセッションデータを保存すると、パフォーマンスとスケーラビリティが向上します。 1)MySQLを構成してセッションデータを保存します:PHP.iniまたはPHPコードでセッションプロセッサを設定します。 2)カスタムセッションプロセッサを実装します:データベースと対話するために、開いて、閉じ、読み取り、書き込み、その他の機能を定義します。 3)最適化とベストプラクティス:インデックス、キャッシュ、データ圧縮、分散ストレージを使用して、パフォーマンスを向上させます。

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

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

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック









