2016-12-20 9 views
0

私はOOPで今読んでいますが、いつも混乱していますが、私はスキルを上げようとしています。親切である)。PHP OOP:マルチプルクラスを一緒に束ねる方法

"コア"クラスが$Appのメインアプリを設計しています。私の考えは、どこでもアプリ内で、あなたは$Appの中からすべてを行うことができるということです。例えば

、私はこれらはすべてspl_autoload_registerを使用して自動的にロードされているなど、データベースを照会する$Dbクラス、電子メールを送信するための$Mailクラスを、持っています。

私の質問は、実際に正しくインスタンス化することです。ここで私は今それをやっている方法は次のとおりです。

のindex.php

require_once('config.php'); // Autoloads classes and some other small stuff 

$App = new App; 

echo $App->Visitor->getIP(); 

App.class.php

class App { 

    public function __construct() { 
     $this->initialize();  
    } 

    private function initialize() { 

     $this->Visitor = new Visitor($this); 
     $this->Db = new Db($this); 
     $this->Mail = new Mail($this); 

    } 

    // Then some public methods... 
    // We are able to use $this->Visitor, $this->Db, etc... 

} 

Visitor.class.php

class Visitor { 

    private $App; 

    public function __construct($App) { 
     $this->App = $App; // I need access to all of App's methods 
    } 

    public function getIP() { 
     return $_SERVER['REMOTE_ADDR'];  
    } 

} 

だから、短いです上の例は、私がこのクラスをどのようにしているかを示しています。 Appクラスは常に、コンストラクタ内のアプリケーション全体で使用するクラスのインスタンスを作成します。

「子」クラスはすべて、$Appインスタンスが[依存関係を挿入する]ため、そのメソッドを使用できます。

これを正しく実行していますか?それは動作しますが、これを行うより効率的な/より良い練習方法があるかどうかわかりません。

+0

興味深いことに、[ソフトウェアエンジニアリング](http://softwareengineering.stackexchange.com/questions/337896/dividing-up-a-large-class-int-tasks-passing-this-when -creating-helper-class)スタックサイト。ヘルパークラスに 'this'を渡してそのプロパティにアクセスできるようにするためのフィードバックは肯定的ではありませんでした。 – mseifert

答えて

1

インスタンス化で基本クラスを注入する際の問題は、すべてのクラスが本当にあいまいな依存関係になってしまうことです。あなたのVisitorクラスは、$_SERVERスーパーグローバルを解析するクラスに依存する可能性がありますが、私はそれを見るだけではわかりません。依存関係はアプリケーションオブジェクト全体です。

クラスが必要とする特定の依存関係(通常はコンストラクタ内)を定義し、その依存関係を適切に提供するものを作成するほうがずっと優れています。これはあなたがヒントしていた「依存性注入」であり、通常、インスタンス化されたすべてのオブジェクトを格納している新しいクラスに注入する準備ができているものがあります(Container)。

だからあなたのアプリは、コンテナの依存関係があります:

$app = new App(new Container); 

をそして、あなたは、サードパーティの依存性注入のライブラリを使用する場合は、あなたが依存関係

class App { 

    /** 
    * @return App\Visitor 
    */ 
    public function getVisitor() 
    { 
     if (!$this->visitor) { 
      $this->visitor = $this->container->get('App\Visitor'); 
     } 

     return $this->visitor; 
    } 
} 

ための容器を求めることができます(推奨 - 自分自身を設計することから始めても少しの正接です)、ライブラリは通常、依存関係を自動的に解決する何らかの方法を提供します。クラスのコンストラクタを見ることができます(タイプヒントが正しくあります。__construct(Visitor $visitor))と、自動的にコンストラクタに引数を提供 - あなたが最初PSR-4Composer autoloadingに慣れるOOPで出始めている場合、私は手動でも、あなたのクラスのすべてがしようとしているなどのように、推薦Reflection SPL

を使用して非常に面倒なことになり、最初に「標準的な」やり方をすることで、あなたが切り替わりたい時に将来の生活が楽になります。

関連する問題