지난 시간에 했던 test.php를 조금 수정한다.
/test.php
<?php include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );
class Members {//클래스의 이름 보통 첫글자를 대문자로 사용, MemberClass 이런식으로 카멜표기법사용
private $name;//클래스에서 사용하는 변수 선언, private은 클래스 안에서만 사용,
protected $email;//protected는 확장 클래스에서도 사용
public function __construct(){//생성자, 클래스를 선언할때 제일 먼저 작동, 아래 내용은 해당 변수에 값을 입력함.
$this->name = "tester";
$this->email = "t@t.com";
}
public function disp(){
echo "name is ".$this->name;
echo "<br>";
echo "email is ".$this->email;
}
public function minfo($userid){
global $mysqli;
$query = "select username,email from members where userid='".$userid."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
$this->name = $rs->username;
$this->email = $rs->email;
return $this;
}
public static function minfo2($userid){
global $mysqli;
$query = "select username,email from members where userid='".$userid."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
$userinfo[0] = $rs->username;
$userinfo[1] = $rs->email;
return $userinfo;
}
}
echo "<pre>";
$member = new Members();//Mebers클래스를 사용하기 위한 인스턴스 생성
$member->disp();//인스턴스를 이용해 Members클래스안에 있는 disp()함수를 호출. 현재 생성자에서 만든 변수값들을 출력
echo "<br>";
echo $member->minfo('admin')->disp();
echo "<br>";
$minfo=Members::minfo2('admin');
print_r($minfo);
echo "<br>";
$minfo2=$member->minfo2('admin');
print_r($minfo2);
echo "<br>";
class Users extends Members {
private $regdate;
public $userArray = array();
public function disp2(){
echo "이름은 ".$this->name;
echo "<br>";
echo "이메일은 ".$this->email;
}
public function disp3(){
echo "가입일은 ".$this->regdate;
}
public function disp4($userid){
echo "게시물등록갯수: ".self::minfo4($userid);
}
public function disp5($userid){
$this->userArray=parent::minfo2($userid);
}
public function minfo3($userid){
global $mysqli;
$query = "select regdate from members where userid='".$userid."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
$this->regdate = $rs->regdate;
return $this;
}
public static function minfo4($userid){
global $mysqli;
$query = "select count(*) as cnt from board where status=1 and userid='".$userid."'";
$result = $mysqli->query($query) or die("query error => ".$mysqli->error);
$rs = $result->fetch_object();
return $rs->cnt;
}
}
$user = new Users();
$user->disp();
echo "<br>";
echo $userinfo=$user->minfo('admin')->disp2();
echo "<br>";
$userinfo=Users::minfo2('admin');
print_r($userinfo);
echo "<br>";
echo $user->minfo3('admin')->disp3();
echo "<br>";
$boardcnt=Users::minfo4('admin');
echo "등록한 게시물수:".$boardcnt;
echo "<br>";
$user->disp4('admin');
echo "<br>";
$user->disp5('admin');
print_r($user->userArray);
echo "<br>";
?>
지난 시간에 만들었던 Members클래스에 추가로 Users클래스를 만들었다.
class Users extends Members {
이렇게. 그런데 뒤에 보니 extends Members라고 돼 있다. 이게 바로 상속이다. Users클래스는 Members클래스를 상속받는 다는 뜻이다. 영어로 그대로 보면 Users클래스는 Members 클래스까지 확장한다는 뜻이다. 인스턴스를 만들어서 테스트해보자
$user는 Users클래스의 인스턴스이다. 다음 줄을 보자.
Users클래스에는 disp함수가 없지만 Users클래스가 Members클래스를 상속했으므로 Members클래스의 disp함수를 사용할 수 가 있다.
이번엔 Users클래스에 있는 disp2()함수를 확인해보자. disp2()함수를 보면
public function disp2(){
echo "이름은 ".$this->name;
echo "<br>";
echo "이메일은 ".$this->email;
}
비쥬얼스튜디오코드로 작성중인 사람들은 확인이 가능할텐데 $this->name 밑에 빨간줄이 그어져 있다. 빨간줄에 마우스를 가져다 보면
Undefined property '$name'.intelephense(1014)
라고 나온다. $name이 선언이 안돼 있다고 한다. Users클래스 안에는 name도 email도 선언이 안돼 있는데 유독 name만 안된다고 하는 이유는 무엇일까?
상속받은 클래스인 Members에 선언된 변수를 확인해 보면 알 수 있다.
private $name;//클래스에서 사용하는 변수 선언, private은 클래스 안에서만 사용,
protected $email;//protected는 확장 클래스에서도 사용
위 글에 설명처럼 private과 protected의 차이때문이다. 그래서 다음 구문을 실행해보면 다음과 같이 나온다.
$user = new Users();
$user->disp();
echo "<br>";
echo $userinfo=$user->minfo('admin')->disp2();
name is tester
email is t@t.com
이름은
이메일은 admin@admin.com
위에 disp()는 상속받은 값을 그대로 출력했고 아래 disp2()는 name을 상속받을 수 없으므로 빈값으로 나온다.
$userinfo=Users::minfo2('admin');
print_r($userinfo);
Members클래스의 함수를 상속했으니 가능하다.
Array
(
[0] => 운영자
[1] => admin@admin.com
)
echo $user->minfo3('admin')->disp3();
echo "<br>";
$boardcnt=Users::minfo4('admin');
echo "등록한 게시물수:".$boardcnt;
자기 자신의 클래스인 Users 클래스 내부의 함수를 호출한 결과는 다음과 같다.
가입일은 2023-04-04 17:46:44
등록한 게시물수:2
public function disp4($userid){
echo "게시물등록갯수: ".self::minfo4($userid);
}
이 함수는 자식 클래스에서 자기 자신의 함수를 호출하는 함수다. self를 사용해 불러온다.
게시물등록갯수: 2
이번엔 클래스안의 함수가 아닌 부모 클래스의 함수를 불러오는 경우다.
public function disp5($userid){
$this->userArray=parent::minfo2($userid);
}
$user->disp5('admin');
print_r($user->userArray);
Array
(
[0] => 운영자
[1] => admin@admin.com
)
이렇게 나오게 된다.
클래스를 직접 만들어서 사용하는 것보다 남이 만들어 놓은 클래스를 사용하는 경우가 많을테니 자꾸 보면서 눈에 익히도록 하자. 또 지금 다 이해가 안되면 그냥 넘어가면 된다. 다른걸 자꾸 하다보면 이해가 될때가 있다. 지금 잘 모르겠다고 PHP를 포기하면 안된다. 나도 처음 시작할때는 클래스를 전혀 다룰줄 몰랐다.(사실 지금도 잘 모른다...ㅠㅠ)
다음 시간엔 몇몇 페이지를 클래스를 이용해 처리해보는 걸 해보도록 하자