1

私はPHPOOの概念に比較的慣れていません。私は次のことをいじっています、

<?php

require('class_database.php');
require('class_session.php');

class something {  

  $database = NULL;
  $session = NULL;

  function __construct() {
    $this->database = new database();
    $this->session = new session();
  }

  function login() {
    $this->session->doLogin();
  }
}
?>

in another script

$something = new something();
$something->login();

この例で$databaseは、MySQLi接続を含む保護された変数を作成するコンストラクターがあります。また、と呼ばれる関数がありますquery()

$session実行する必要がある場合$database->query、どうすればそれを実行できますか?新しいデータベースクラスを作成するのは非常に無駄ですが、からアクセスできないよう$databaseです$session

避けるべきだった自分自身のために大きな面倒を作成しましたか?クレデンシャルをチェックするためにデータベースにアクセスする必要があるログイン検証を提供するセッションが必要です。

助けてくれてありがとう

4

2 に答える 2

3

See http://en.wikipedia.org/wiki/Dependency_Injection and http://martinfowler.com/articles/injection.html for more info about this topic.

<?php
class something {  
  require('class_database.php');
  require('class_session.php');

  $database = new database();
  // dependency injection either here in constructor or in the function that needs it below
  $session = new session($database);


  $session->doSomething(); //This method wants to access $database->query();
}
?>

UPDATE (OP changed code in question)

<?php

require('class_database.php');
require('class_session.php');

class something
{  
  protected $session = NULL;

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

  public function login() {
    $this->session->doLogin();
  }
}

$database = new database();
$session = new session($database);
$something = new something($session);
$something->login();
?>
于 2012-05-14T07:35:32.437 に答える
2

セッション クラスのコンストラクターに、データベースのインスタンスであるパラメーターをとらせるのはどうですか?

$database = new database();
$session = new session($database);

次に、セッション コンストラクターで、それをオブジェクトのプロパティに設定し、それを利用します。

private var $_database;

public function __construct($database) {
   $this->_database = $database;
}

public function doSomething() {
    $this->_database->query();
}
于 2012-05-14T07:36:39.423 に答える