2017-04-24 13 views
1

私はPDO MySQLクラスを書き直そうとしていますが、それは依存性注入の形式を使用しています。ここでPHP OOPスコープについて混乱しています

は、それが接続されている方法は次のとおりです。

public function __construct($dsn, $username, $password) 
{ 
    $options = [ 
     PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
     PDO::ATTR_STATEMENT_CLASS => array("EPDOStatement\EPDOStatement", array($this)), 
     PDO::ATTR_EMULATE_PREPARES => false, // allows LIMIT placeholders 
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 
    ]; 
    parent::__construct($dsn, $username, $password, $options); 
} 

次にこのように呼ばれています:今

$dbl = new db_mysql("mysql:host=".$db_conf['host'].";dbname=".$db_conf['database'],$db_conf['username'],$db_conf['password']); 

、別のクラス内の "コア" という名前には__constructでこれを持っている:

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

public static function config($key) 
{ 
    if (empty(self::$config)) 
    { 
     // get config 
     $get_config = $this->database->select("config", '`data_key`, `data_value`'); 
     $fetch_config = $get_config->fetch_all(); 

     foreach ($fetch_config as $config_set) 
     { 
      self::$config[$config_set['data_key']] = $config_set['data_value']; 
     } 
    } 

    // return the requested key with the value in place 
    return self::$config[$key]; 
} 
} 

これはそうです:

$core = new core($dbl); 

したがって、データベース接続を取得して、コアクラス内の "public"に設定されている$ databaseに割り当てます。問題は、私は設定関数を呼び出すとき、私はこのエラーを取得することです:

PHP Fatal error: Uncaught Error: Using $this when not in object context 

それはエラーがライン

"$this->database->select" inside the "config"

機能から来て言及しています。

+0

どのように設定機能を呼び出していますか? –

+0

あなたのインデントはどうですか?それは読みにくい。 –

答えて

4

configメソッドは静的です。

スタティックメソッドにはオブジェクトがインスタンス化されずにアクセスできるため、$thisは現在のオブジェクトに使用可能なハンドルではありません。

+0

うん、それはまさに、ありがとう:) – NaughtySquid

1

あなたは$thisは、クラスインスタンスへの参照である、とinstanceはオブジェクトのみに存在するため、それはクラス参照にアクセスすることはできませんので、あなたは、オブジェクトを作成せずに静的メソッドを呼び出すことができ、静的メソッドで$thisを使用することはできません。..

を静的でないようにメソッドを変更してください。クラスオブジェクトを作成した後に使用してください

+0

他の答えと同じですが、もう一度感謝:) – NaughtySquid

関連する問題