다른 클래스에서 PDO 연결을 사용하는 방법
<p>객체 지향 프로그래밍(OOP)의 작동 방식을 이해하는 데 문제가 있는 것 같습니다. 작동하도록 코드를 변경했지만 올바른 방법은 아닌 것 같습니다. 다음은 시나리오입니다(아니요. 사용자 로그인을 직접 만드는 것은 아닙니다. OOP를 더 잘 이해하기 위한 것입니다). </p>
<p>database.php 파일이 있습니다:</p>
<pre class="brush:php;toolbar:false;">클래스 데이터베이스 {
/* 속성 */
비공개 $conn;
개인 $dsn = 'mysql:dbname=test;host=127.0.0.1';
개인 $user = '루트';
개인 $password = '';
/* 데이터베이스 연결 생성 */
공개 함수 __construct() {
노력하다 {
$this->conn = new PDO($this->dsn, $this->user, $this->password);
} 잡기(PDOException $e) {
"오류!: "를 인쇄합니다. $e->getMessage() "";
주사위();
}
$this->conn을 반환합니다.
}
}</pre>
<p>그래서 이 수업에서는 데이터베이스 연결을 만들고 연결(객체?)을 반환합니다</p>
<p>그런 다음 유명한 User 클래스인 두 번째 클래스가 있습니다(실제로 자동 로딩을 사용하지 않지만 그것에 대해 알고 있습니다). </p>
<pre class="brush:php;toolbar:false;">include "database.php";
클래스 사용자 {
/* 속성 */
비공개 $conn;
/* 데이터베이스 액세스 얻기 */
공개 함수 __construct() {
$this->conn = 새 데이터베이스();
}
/* 로그인 사용자 */
공개 함수 로그인() {
$stmt = $this->conn->prepare("사용자 이름, 사용자 메일 FROM 사용자 선택");
if($stmt->execute()) {
while($rows = $stmt->fetch()) {
$fetch[] = $행;
}
$fetch를 반환합니다.
}
또 다른 {
거짓을 반환;
}
}
}</pre>
<p>이것이 제가 듣는 두 수업입니다. 보시다시피 별거 없습니다. 이제 <code>login</code> 함수 이름으로 혼동하지 마세요. 실제로는 데이터베이스에서 일부 사용자 이름과 사용자 메일을 선택하여 표시하려고 합니다. 나는 다음과 같은 방법으로 이를 달성하려고 했습니다. </p>
<pre class="brush:php;toolbar:false;">$user = new User();
$list = $user->로그인();
foreach($list를 $test로 표시) {
echo $test["사용자 이름"];
}</pre>
<p>여기에 문제가 있습니다. 이 코드를 실행하면 다음과 같은 오류 메시지가 나타납니다. </p>
<인용문>
<p>잡히지 않은 오류: 정의되지 않은 메소드 Database::prepare()에 대한 호출</p>
</인용문>
<p>이 오류의 원인을 실제로 이해하고 있는지 잘 모르겠습니다.</p>
<p><strong>다음을 변경하면 코드가 제대로 작동합니다. </strong></p>
<p>database.php의 <code>$conn</code>를 비공개에서 공개로 변경했습니다(이건 나쁜 것 같은데...? 하지만 비공개인 경우 데이터베이스 클래스 실행 쿼리에서만 사용할 수 있습니다. 내부적으로는, 그렇죠? 그러면 이러한 쿼리를 모두 Database 클래스에 넣어야 할까요? 큰 프로젝트에서는 매우 커질 것이기 때문에 이는 좋지 않은 것 같습니다...)</p> ;
<p>두 번째 변경 사항은 다음과 같습니다.</p>
<p>user.php 파일의 <code>$this->conn->prepare</code>를 <code>$this->conn->conn->prepare< 코드>. 나는 이것에 대해 정말로 모른다. </p>
<p>내 말은, <code>user.php</code>의 생성자에 <code>$this->conn = new Database()</code>가 있다는 뜻입니다. DB 클래스에서 연결 개체를 반환합니다. 왜 두 번째 <code>conn-></code></p>가 있어야 하는지 모르겠습니다.