2017-05-15 17 views
0

PHPでOOPを使用してmysqlクエリを作成しようとしています。下のコードでは、クラス "database_disconnection"はエラーや注意を投げませんが、最後のクラス "database_query"は$ database_handleが未定義であることを通知します。私はdatabase_connectionの派生クラスとしてdatabase_queryクラスを作成したので、何が原因か分かりません。このクラスには$ database_handle変数がprivateとして含まれています。どんな助けでも大歓迎です!未定義の変数PHPのプライベート変数を持つ派生クラスですか?

オブジェクトのインスタンス化:

include("includes/database_classes.php"); 

new database_connection; 
new database_query('SELECT * FROM users'); 

とクラス:あなたのdatabase_queryコンストラクタで

<?php 
/*----------------------------------------------------------------------------------------------------*/ 
class database_connection 
{ 

    private $username = 'root'; 
    private $password = ''; 
    private $hostname = 'localhost'; 
    private $database = 'assistant';  
    private $database_handle; 

    function connect() 
    { 
     try 
     { 
      $database_handle = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 
     } 

     catch (PDOException $e) 
     { 
      print "Error!: " . $e ->getMessage() . "<br/>"; 
      die(); 
     } 
    } 
} 

/*----------------------------------------------------------------------------------------------------*/ 
class database_disconnection extends database_connection 
{ 
    function disconnect() 
    { 
     $database_handle = null; 
    } 
} 

/*----------------------------------------------------------------------------------------------------*/ 
class database_query extends database_connection 
{ 
    private $mysql_statement; 

    function __construct($mysql_statement) 
    { 
     $this->mysql_statement = $mysql_statement; 

     foreach($database_handle->query("$mysql_statement") as $row) { 
      print_r($row); 
     } 
    } 

} 

/*----------------------------------------------------------------------------------------------------*/ 
?> 
+0

'$ database_handle'はローカルスコープの変数です。 '$ this-> database_handle'はクラスプロパティ –

+0

を参照します。また、プライベート属性は子クラスでは使用できません。 – dan08

+0

Dan08 - ありがとう、私はプライベートと保護を混乱させる!メモをありがとう。しかし、誘導体を許可している保護されたアクセス制限を使用することはまだ機能していません。 Mark Ba​​ker'sとのあなたのコメントは、それを通知するために働いた。ありがとうございました! – user4333011

答えて

0

、あなたはそれを初期化する前に$database_handleを使用しようとしています。気づいた場合は、親クラスのconnect関数でのみ初期化します(database_connection)。

参照する前にconnectを呼び出すか、それを親のコンストラクタで初期化し、それを(parent::__construct();)と呼んでください。