インターフェイスは最新の PHP の新しい機能ではありませんが、非常に重要です。インターフェイスの使い方を学ぶことでプログラミング能力が大幅に向上するため、日常の開発ではできるだけインターフェイスを使用する必要があります。
インターフェイスは、2 つの PHP オブジェクト間のコントラクトです。Laravel の最下層は、インターフェイスを Contracts ディレクトリに直接配置します。
インターフェイスは、コードと依存関係を結合します。分離されており、私たちのコードは、期待されるインターフェイスを実装するサードパーティのコードに依存することができます。サードパーティのコードがインターフェイスを実装する方法は気にせず、サードパーティのコードが指定されたインターフェイスを実装するかどうかだけを考慮します。 。
作成したコードが指定されたクラスのオブジェクトを処理する必要がある場合、常にそのクラスのオブジェクトのみを使用できるため、コードの機能は完全に制限されます。インターフェイスの場合、コードは、このインターフェイスを実装するオブジェクトをどう処理するかをすぐに認識します。インターフェイスがどのように実装されるかは関係なく、指定されたインターフェイスを実装するかどうかだけがわかります。
Laravel の最下層で提供される前述の CacheStore (Store インターフェース) を例に挙げてみましょう。このインターフェースの機能は、get、put、flush、などのキャッシュ メモリの一般的なメソッドをカプセル化することです。など:
<?phpnamespace Illuminate\Contracts\Cache;interface Store{ /** * Retrieve an item from the cache by key. * * @param string|array $key * @return mixed */ public function get($key); /** * Retrieve multiple items from the cache by key. * * Items not found in the cache will have a null value. * * @param array $keys * @return array */ public function many(array $keys); /** * Store an item in the cache for a given number of minutes. * * @param string $key * @param mixed $value * @param int $minutes * @return void */ public function put($key, $value, $minutes); /** * Store multiple items in the cache for a given number of minutes. * * @param array $values * @param int $minutes * @return void */ public function putMany(array $values, $minutes); /** * Increment the value of an item in the cache. * * @param string $key * @param mixed $value * @return int|bool */ public function increment($key, $value = 1); /** * Decrement the value of an item in the cache. * * @param string $key * @param mixed $value * @return int|bool */ public function decrement($key, $value = 1); /** * Store an item in the cache indefinitely. * * @param string $key * @param mixed $value * @return void */ public function forever($key, $value); /** * Remove an item from the cache. * * @param string $key * @return bool */ public function forget($key); /** * Remove all items from the cache. * * @return void */ public function flush(); /** * Get the cache key prefix. * * @return string */ public function getPrefix();}
これの利点は、たとえば、Laravel が配列 (Array)、データベース (Database)、ファイル (File)、Apc、Memcache をサポートしていることです。 、Redis およびその他のキャッシュ メモリにより、コード内で対応するメソッドを簡単に使用してデータをキャッシュできます。 Memcached ドライバーを例に挙げてみましょう。対応する実装クラスは MemcachedStore です。
<?phpnamespace Illuminate\Cache;use Memcached;use Illuminate\Contracts\Cache\Store;class MemcachedStore extends TaggableStore implements Store{ /** * The Memcached instance. * * @var \Memcached */ protected $memcached; /** * A string that should be prepended to keys. * * @var string */ protected $prefix; /** * Create a new Memcached store. * * @param \Memcached $memcached * @param string $prefix * @return void */ public function __construct($memcached, $prefix = '') { $this->setPrefix($prefix); $this->memcached = $memcached; } /** * Retrieve an item from the cache by key. * * @param string|array $key * @return mixed */ public function get($key) { $value = $this->memcached->get($this->prefix.$key); if ($this->memcached->getResultCode() == 0) { return $value; } } /** * Retrieve multiple items from the cache by key. * * Items not found in the cache will have a null value. * * @param array $keys * @return array */ public function many(array $keys) { $prefixedKeys = array_map(function ($key) { return $this->prefix.$key; }, $keys); $values = $this->memcached->getMulti($prefixedKeys, null, Memcached::GET_PRESERVE_ORDER); if ($this->memcached->getResultCode() != 0) { return array_fill_keys($keys, null); } return array_combine($keys, $values); } /** * Store an item in the cache for a given number of minutes. * * @param string $key * @param mixed $value * @param int $minutes * @return void */ public function put($key, $value, $minutes) { $this->memcached->set($this->prefix.$key, $value, $minutes * 60); } /** * Store multiple items in the cache for a given number of minutes. * * @param array $values * @param int $minutes * @return void */ public function putMany(array $values, $minutes) { $prefixedValues = []; foreach ($values as $key => $value) { $prefixedValues[$this->prefix.$key] = $value; } $this->memcached->setMulti($prefixedValues, $minutes * 60); } /** * Store an item in the cache if the key doesn't exist. * * @param string $key * @param mixed $value * @param int $minutes * @return bool */ public function add($key, $value, $minutes) { return $this->memcached->add($this->prefix.$key, $value, $minutes * 60); } /** * Increment the value of an item in the cache. * * @param string $key * @param mixed $value * @return int|bool */ public function increment($key, $value = 1) { return $this->memcached->increment($this->prefix.$key, $value); } /** * Decrement the value of an item in the cache. * * @param string $key * @param mixed $value * @return int|bool */ public function decrement($key, $value = 1) { return $this->memcached->decrement($this->prefix.$key, $value); } /** * Store an item in the cache indefinitely. * * @param string $key * @param mixed $value * @return void */ public function forever($key, $value) { $this->put($key, $value, 0); } /** * Remove an item from the cache. * * @param string $key * @return bool */ public function forget($key) { return $this->memcached->delete($this->prefix.$key); } /** * Remove all items from the cache. * * @return void */ public function flush() { $this->memcached->flush(); } /** * Get the underlying Memcached connection. * * @return \Memcached */ public function getMemcached() { return $this->memcached; } /** * Get the cache key prefix. * * @return string */ public function getPrefix() { return $this->prefix; } /** * Set the cache key prefix. * * @param string $prefix * @return void */ public function setPrefix($prefix) { $this->prefix = ! empty($prefix) ? $prefix.':' : ''; }}
コンストラクターで Memcached インスタンスを渡し、インターフェイス ベースで定義されたメソッドを具体的に実装していることがわかります。このインスタンスでは、他の実装クラスも同様です。このようにして、Store インターフェイスを通じてキャッシュ コードを特定の依存関係から分離し、その後の拡張と他の実装クラスによる使用を容易にします。たとえば、ここでは CacheStore クラスを定義します:
<?phpnamespace App\Tests;use Illuminate\Contracts\Cache\Store;class CacheStore{ protected $store; public function __construct(Store $store) { $this->store = $store; } public function get($key) { return $this->store->get($key); } public function put($key, $value, $minutes=1) { $this->store->put($key, $value, $minutes); } public function forget($key) { $this->store->forever($key); } public function flush() { $this->store->flush(); }}
次に、構成ファイルで使用されるデフォルトのキャッシュ ドライバー (Memcached など) を構成し、コード内で呼び出すときに次のように使用します。
$memcached = new \Memcached();$memcached->addServer('localhost',11211);$memcachedCache = new MemcachedStore($memcached);$cacheStore = new CacheStore($memcachedCache);$cacheStore->put('site','http://LaravelAcademy.org');dd($cacheStore->get('site'));
注: これは単なるデモです。Laravel が提供するキャッシュ機能は実際には使用しないでください。実際、Laravel の基礎となるキャッシュ処理は、私が持っているデモ コードよりもはるかに洗練されています。ここ。
つまり、インターフェイスを使用して記述されたコードはより柔軟であり、インターフェイスを使用した後は、その実装方法を知るだけで済むため、より多くの人がそのコードを使用するようになります。コードをシームレスに使用できます。実際、サービス プロバイダーと依存関係の注入を使用するときは、このインターフェイス指向のプログラミングに基づいて、より複雑な拡張機能も作成します。