ホームページ > バックエンド開発 > PHPチュートリアル > PHP静的クラスをベースにした原罪の詳細解説_PHPチュートリアル

PHP静的クラスをベースにした原罪の詳細解説_PHPチュートリアル

WBOY
リリース: 2016-07-21 15:10:49
オリジナル
891 人が閲覧しました

ヘーゲルには「存在は合理的である」という有名な言葉があります。これを引数として使用すると、静的クラスの使用は合理的でなければなりません。ただし、極端な場合には、コードが静的クラスに依存しすぎると、コードの劣化は避けられません。これもケシと同じで、ハーブとしては薬効があるのですが、不謹慎に大量に使用すると麻薬になってしまいます。

静的クラスとは

いわゆる静的クラスとは、オブジェクトにインスタンス化する必要がなく、静的に直接呼び出すことができるクラスを指します。 コードは次のとおりです:

コードをコピーします コードは次のとおりです:

ClassMath

{public static function ceil($ value)
($ value、

パブリック静的関数 Floor($value)
{
Return Floor($value);
}

}



?>

このクラスが果たす役割は名前空間に似ています。これが、多くの人が静的クラスを使用することを好む最も直接的な理由かもしれません。


静的クラスの問題

本質的に、静的クラスはプロセス指向です。通常、元のプロセス指向のコードを機械的にまとめただけだからです。結果はクラスの形式で存在しますが、この時点のクラスはむしろ皇帝の作品に似ています。新しい服。 , そのため、静的クラスは実際にはオブジェクト指向のシェルをかぶってプロセス指向のことを行っていると言えます。

オブジェクト指向設計の原則の 1 つ: 実装のためのプログラムではなく、インターフェースのためのプログラム。これにはどのような違いがあるのでしょうか?例: 価格の要因はさておき、個別のグラフィックス カードを搭載したコンピュータと統合グラフィックス カードを搭載したコンピュータのどちらを好みますか?ほとんどの人はディスクリートグラフィックスカードを選択すると思います。独立したグラフィックス カードはインターフェイス プログラミングをターゲットとみなすことができ、統合グラフィックス カードは実装プログラミングをターゲットとみなすことができます。実装固有のプログラミングの欠点は明らかです。変更の可能性が失われるということです。

詳しく説明するために記事管理システムの例を作成してみましょう:

コードをコピーします

コードは次のとおりです:

class Article
{
public function save()
{

ArticleDAO::save();

}}



?>

Article は必要なドメイン ロジックを実装し、データの永続化を ArticleDAO に任せます。ArticleDAO は静的クラスであり、マザーボードにはんだ付けされた統合グラフィックス カードと同じくらい変更が難しいとします。コードでは ArticleDAO の実装を Mock する必要があるかもしれませんが、呼び出すときに静的クラスの名前が使用されるため、実際には Mock を実現するメソッドがいくつかあります。 :


コードをコピーします


コードは次のとおりです:
class Article
{
private static $dao = 'ArticleDAO';

パブリック静的関数 setDao($dao)
{
self::$dao = $dao;
}


public static function save()
{
$dao = self::$dao;

$ dao :: save();

?>

変数を使用すると、実行時にどの静的クラスを使用するかを設定できます:

コードをコピーします

コードは次のとおりです:


Article::setDao('MockArticleDAO');
記事::save();

?>


この実装方法は Mock の問題を解決しているように見えますが、第一に、元のコードが変更され、開始と終了の原則に違反します。第二に、静的変数が導入され、静的変数は共有状態であり、他のコードの実行を妨げる可能性があります。 , したがって、完璧な解決策ではありません。

補足説明すると、動的言語の特性を利用して、実際には別のクラス定義ファイルを要求するだけでMockを実装することができますが、これにはデメリットもあり、スクリプト内で実装方法を複数回変更する必要があることが想定されますが、実際には、要求する機会は 1 回だけです。そうでない場合は、重複定義エラーが発生します。


オブジェクトの値

静的クラスを放棄して代わりにオブジェクトを使用する場合、記事管理システムの例をどのように実装する必要がありますか? コードは次のとおりです:

コードをコピーします コードは次のとおりです:

クラス記事
{
private $dao;

パブリック関数__construct($ dao = null)

$this->setDao($dao);
}

パブリック関数 setDao($dao)

{
$this->dao = $dao;

}


パブリック関数 save()
{
$this->dao->save();

}

}

?>

実際、ここではよく人々が呼ぶ依存関係注入テクノロジーが使用されており、コンストラクターまたはセッターを通じて依存オブジェクトを注入します。



コードをコピーします

コードは次のとおりです。 ?php $article = 新しい記事(新しい MockArticleDAO()); $article->save();
?>

オブジェクトには独自の状態があり、共有された状態は他のコードの実行を妨げません。

もちろん、静的クラスにはいくつかのステートレス ツール クラスの実装に非常に適した側面もあります。しかし、ほとんどの場合、私の主観的な傾向は、オブジェクトの早期固定化を避けるために非常に明確です。システム。ちなみに、静的クラスはオブジェクトよりも速いなどと誰も言わないことを願っています。ありがとうございます。



http://www.bkjia.com/PHPjc/327036.html


www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/327036.html

ヘーゲルには「存在とは合理性である」という有名な言葉があります。これを引数として使用すると、静的クラスの使用は合理的でなければなりません。ただし、コードが静的クラスに依存しすぎると、その劣化は終わります...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート