1

私は以前に OOP コードを書いたことがなく、常に余分なキーストロークを避けるように努めてきました。とにかく、読みやすさを向上させるはずなので、思い切って行っています。

とにかく、クラスがお互いのメソッドにアクセスできるようにするのに苦労しています。

これが私のセットアップです:

$conf = new Conf(); // boot up!

// Include dependencies, system files and other functions
require_once $conf->getIncludePath() . 'error.php';
require_once $conf->getIncludePath() . 'pool.php';
require_once $conf->getIncludePath() . 'database.php';
require_once $conf->getIncludePath() . 'api.php';
require_once $conf->getIncludePath() . 'user.php';
require_once $conf->getIncludePath() . 'forms.php';
require_once $conf->getIncludePath() . 'page.php';
require_once $conf->getIncludePath() . 'resources.php';

$error = new Error();
$pool = new Pool();
$db = new Database();
$api = new Api();
$user = new User();
$forms = new Forms();
$page = new Page();
$resources = new Resources();

User私の質問は、クラス内のメソッドがクエリメソッドを内部で実行できるようにするには、どうすれDatabaseば情報を取得できるのでしょうか?

私はglobal $db; global $user; etc.これまでにすべてのメソッド内で使用していることを認識していますが、これらの変数を使用するたびに本質的に再宣言することなく、これらの変数にアクセスする方法はありませんか?

ありがとう

桟橋

4

3 に答える 3

1

依存性注入を使用してください!

クラスのインスタンスを必要な他のすべてのクラスにDBHandler格納する新しいクラス を作成できます。Database

例えば:

class DBHandler {

  public static $db;
 
  public static function init($db) {
    self::$db = $db;
  }
}

$db = new Database();
DBHandler::init($db);

次に、キーワードを使用して、このクラスから継承する必要があります。extends

すなわち:

class User extends DBHandler {
  // ... your code here ...
}

これは、依存性注入を実装する方法の例です。


__autoload() 関数

require関数を使用すれば、必要なたびにクラスを作成する必要はありません__autoload()

たとえば、依存関係を自動的に解決するには、次のようにします。

function __autoload($classname) {
  require_once $classname . ".php";
}
于 2013-09-26T15:57:38.137 に答える
0

nettuts+のチュートリアルに従って、次のように書きました。

// load configuration
require_once 'includes/class.conf.php';
$conf = new Conf(dirname(__FILE__));

// dependency class
$conf->registerRequiredFile('dependencies');
$dependencies = new Dependencies();

// start registering dependencies
$conf->registerRequiredFile('error');
$error = $dependencies->error = function(){ // error
    $error = new Error();
    $error->conf = $conf;
    return $error;
};

$conf->registerRequiredFile('pool');
$pool = $dependencies->pool = function(){ // error
    $pool = new Pool();
    $pool->db = $db;
    $pool->user = $user;
    $pool->error = $error;
    // etc. any other dependencies
    return $pool;
};

それは完全に機能します。最初の conf ファイルには registerRequiredFile メソッドが含まれており、次に、指定されたパラメーターに基づいて uri を require_once します。

私を正しい方向に向けてくれてありがとう!

于 2013-09-28T11:12:59.940 に答える