Cara menggunakan sambungan PDO dalam kelas lain
<p>Saya rasa seperti saya menghadapi masalah memahami cara pengaturcaraan berorientasikan objek (OOP) berfungsi. Saya telah menukar kod supaya ia berfungsi, tetapi saya tidak fikir ia adalah cara yang betul. Berikut ialah senario (tidak, saya tidak mencipta log masuk pengguna sendiri, ini hanya untuk memahami OOP dengan lebih baik): </p>
<p>Saya mempunyai fail pangkalan data.php:</p>
<pre class="brush:php;toolbar:false;">class Pangkalan Data {
/* Atribut */
persendirian $conn;
persendirian $dsn = 'mysql:dbname=test;host=127.0.0.1';
peribadi $user = 'root';
$kata laluan peribadi = '';
/* Buat sambungan pangkalan data */
fungsi awam __construct() {
cuba {
$this->conn = new PDO($this->dsn, $this->user, $this->password);
} tangkapan (PDOException $e) {
cetak "Ralat!: " $e->getMessage() .
mati();
}
pulangkan $this->conn;
}
}</pre>
<p>Jadi dalam kelas ini, saya mencipta sambungan pangkalan data dan mengembalikan sambungan (objek?)</p>
<p>Kemudian saya mempunyai kelas kedua, kelas Pengguna yang terkenal (sebenarnya saya tidak menggunakan autoloading, tetapi saya tahu mengenainya): </p>
<pre class="brush:php;toolbar:false;">include "database.php";
Pengguna kelas {
/* Atribut */
persendirian $conn;
/* Dapatkan akses pangkalan data */
fungsi awam __construct() {
$this->conn = Pangkalan Data baharu();
}
/* Pengguna log masuk */
log masuk fungsi awam () {
$stmt = $this->conn->prepare("PILIH nama pengguna, mel pengguna DARI pengguna");
if($stmt->execute()) {
while($rows = $stmt->fetch()) {
$fetch[] = $rows;
}
pulangkan $fetch;
}
lain {
kembali palsu;
}
}
}</pre>
<p>Ini adalah dua kelas saya. Seperti yang anda lihat, bukan masalah besar. Sekarang, jangan keliru dengan nama fungsi <kod>log masuk</kod> - sebenarnya, saya hanya cuba memilih beberapa nama pengguna dan mel pengguna daripada pangkalan data dan memaparkannya. Saya cuba mencapainya dengan: </p>
<pre class="brush:php;toolbar:false;">$user = new User();
$list = $user->log masuk();
foreach($list as $test) {
echo $test["nama pengguna"];
}</pre>
<p>Ada masalah di sini. Apabila saya melaksanakan kod ini saya mendapat mesej ralat berikut: </p>
<blockquote>
<p>Ralat Tidak Ditangkap: Panggilan ke kaedah tidak ditentukan Pangkalan Data::prepare()</p>
</blockquote>
<p>Saya tidak pasti saya benar-benar memahami punca ralat ini.</p>
<p><strong>Kod berfungsi dengan baik apabila saya menukar yang berikut: </strong></p>
<p>Menukar <kod>$conn</code> dalam pangkalan data.php daripada persendirian kepada awam (saya rasa ini buruk...? Tetapi apabila ia peribadi, saya hanya boleh menggunakannya dalam kelas Pangkalan data melaksanakan pertanyaan secara dalaman, kan? Jadi patutkah saya meletakkan semua pertanyaan ini dalam kelas Pangkalan Data saya rasa ini tidak baik kerana dalam projek besar ia akan menjadi sangat besar...)</p> ;
<p>Perubahan kedua ialah: </p>
<p>Tukar <kod>$this->conn->sediakan</code> dalam fail user.php kepada <code>$this->conn->conn->sediakan< kod>. Saya benar-benar tidak tahu tentang ini. </p>
<p>Maksud saya, dalam pembina <code>user.php</code>, saya mempunyai <code>$this->conn = new Database()</code>, Sejak Pangkalan Data baharu akan mengembalikan objek sambungan dari kelas DB, saya benar-benar tidak tahu mengapa mesti ada <code>conn-></code></p>