ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるトレイト定義の使い方とインターフェースの違いを詳しく解説

PHPにおけるトレイト定義の使い方とインターフェースの違いを詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 11:12:072536ブラウズ

PHP5.4.0 以降、PHP は Trait と呼ばれるコード再利用メソッドを実装しました。 PHP は単一継承であるため、複数の異なる機能が必要な場合は、複数の基本クラスを組み合わせる必要がありますが、Traits の利点は、それらを自由に組み合わせることができ、コードが明確であることです。この記事では主に PHP の特徴を紹介しますので、困っている方は参考にしてください。

前書き

元同僚が転職し、面接中に PHP の特徴について尋ねられました。使ったことがないのでうまく答えられなかったのですが、おそらく何度か使ったことがあるので、考えて以下にまとめてみました。

trait

trait は、一部のクラス (クラス) が特定の

属性

またはメソッドを持つ必要があるが、同じ親クラスの他のクラスがこれらの 属性やメソッド を含めることを避ける必要がある場合に使用されます。 もちろん、これは開発者のクラスを抽象化する能力にも関連しており、優れた抽象化機能を備えており、特性の使用を減らすことができるものもあります。ただし、この状況は避けられないものであり、そうでない場合は特性の出現が無意味になります。トレイトを使用する場合、開発者に制約

の役割を果たすことができ、開発プロセス中に呼び出す必要があるトレイトの特定のプロパティとメソッドに注意を払うように開発者に思い出させます。

同僚が良い質問を提起しました。インターフェイス) もこの目的に使用されますか?

早速、例を見てみましょう:

たとえば、Web サイト上のさまざまなデータを収集したい場合は、Spider クラス を開発しました。 /code> には、<code> request() というメソッドがリクエストを担当します

<?php namespace XWSoul\Network;
class Spider
{
 public function request($url)
 {
 //do sth.
 }
}
ただし、データ収集のプロセス中に、スパイダーに敏感な Web サイトとそうでない Web サイトがあります。ただし、プロキシを使用するとクロール速度に影響するため、Spider の一部のサブクラスではプロキシを使用する必要があるため、可能な限りプロキシを使用しないようにします。現時点では、新しい特性 Proxy:
<?php namespace XWSoul\Network;
trait Proxy
{

 protected $isProxy = false;

 public function useProxy($proxy)
 {
 //do sth proxy setups.
 $this->isProxy = true;
 return $this;
 }

 public function request($url)
 {
 if (!$this->isProxy) {
  throw new Exception("Please using proxy.");
 }
 //do sth.
 return parent::request($url);
 }
}

を追加しました。この特性は Spider の request() メソッドをオーバーライドし、プロキシを呼び出さずに呼び出すと例外がスローされることを制限します。

. Spider 有个方法叫 request() 负责请求.

rrreee

但是采集数据的过程中, 有些网站对蜘蛛敏感有些则不. 对于敏感的网站, 我们给出了一个使用代理的解决方案. 但是使用代理是会影响抓取速度的. 这就产生了 Spider 的子类有些需要用代理, 而能不用代理则尽量不用的情况.

于是这个时候我们新增了一个 trait Proxy:

rrreee

trait 重写了 Spider 的 request() 前の質問に戻る、トレイト (インターフェイス) の使用法とインターフェイスの違いは何ですか?

インターフェイスの制約は事前に定義されており、メソッドの実装を制約することはできますが、メソッドを制約することはできません。メソッドの呼び出しは、実装された後の呼び出しです。重要なのは、それ自体を呼び出すクラス (意味のない文) に制約を課すだけであり、それ自体を呼び出さないクラス (意味のない文) には影響を与えないことです。同時に、再利用可能であり、Spider を破壊しません。クラス自体の実装が増えても、Spider は依然として同じ Spider です。後で言うこと

誰かが別のリクエストを実装することを決定するかもしれません。 、たとえば、proxyRequst では終わりではありませんか? あなたの言ったことは理にかなっています...しかし、別のプロキシを使用した場合、リクエストの詳細に違いがある場合はどうすればよいですか?コード

のようなすっきりした解決策をなぜ放棄する必要があるのでしょうか?

以上がPHPにおけるトレイト定義の使い方とインターフェースの違いを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。