ホームページ  >  記事  >  バックエンド開発  >  PHP のトレイトの簡単な紹介

PHP のトレイトの簡単な紹介

墨辰丷
墨辰丷オリジナル
2018-05-25 09:54:221244ブラウズ

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

前書き

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

trait

trait は、一部のクラス (Class) が特定の属性またはメソッドを持つ必要があり、同じ親の他のクラスがこれらの属性やメソッドを含めないようにする必要がある場合に使用されます

もちろん、これにも関連します。開発者のクラスを抽象化する能力がある場合は、特性の使用を減らすことができますが、そうでない場合は特性の出現が無意味になります。開発者を制約する役割を果たし、開発プロセス中に呼び出す必要がある特性の特定の属性とメソッドに注意を払うよう開発者に思い出させます。

これはインターフェイスでも同じではないでしょうか?

急ぐ必要はありません。まず例を見てみましょう:

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

<?php namespace XWSoul\Network;
class Spider
{
 public function request($url)
 {
 //do sth.
 }
}

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

<?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 的子类有些需要用代理, 而能不用代理则尽量不用的情况.

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

rrreee

trait 重写了 Spider 的 request()

ただし、データ収集の過程で、一部の Web サイトはスパイダーに敏感ですが、一部の Web サイトはスパイダーに敏感ではありません。ただし、プロキシを使用すると、クロール速度に影響を与えるため、Spider の一部のサブクラスではプロキシを使用する必要がありますが、現時点ではプロキシを使用しないようにします。新しい特性 Proxy を追加しました:

rrreee

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

前の質問に戻りますが、トレイトとインターフェイスの使用の違いは何ですか?

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

トレイトの使用はすでに非常に効果的だと思います。

後で


誰かが別のリクエスト、例えばproxyRequstを実装することに決めてもいいですか?あなたの言ったことは理にかなっています...しかし、別のプロキシを使用し、違いがある場合はどうすればよいですか?リクエストの詳細は、コード内で if if と言い続けています。なぜ trait がこのような新鮮な解決策を放棄する必要があるのでしょうか? 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:
PHP での

trait

の使用方法に関する詳細な画像とテキスト

Traits のプロパティと php の基本的な使用法

PHP の Trait の特性と機能の共有HP

🎜🎜🎜🎜

以上がPHP のトレイトの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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