반응형

지난 시간에 했던 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 = new Users();

$user는 Users클래스의 인스턴스이다. 다음 줄을 보자.

 

$user->disp();

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를 사용해 불러온다.

$user->disp4('admin');
게시물등록갯수: 2

이번엔 클래스안의 함수가 아닌 부모 클래스의 함수를 불러오는 경우다. 

 

public function disp5($userid){
        $this->userArray=parent::minfo2($userid);
    }
$user->disp5('admin');
print_r($user->userArray);
Array
(
    [0] => 운영자
    [1] => admin@admin.com
)

이렇게 나오게 된다.

 

클래스를 직접 만들어서 사용하는 것보다 남이 만들어 놓은 클래스를 사용하는 경우가 많을테니 자꾸 보면서 눈에 익히도록 하자. 또 지금 다 이해가 안되면 그냥 넘어가면 된다. 다른걸 자꾸 하다보면 이해가 될때가 있다. 지금 잘 모르겠다고 PHP를 포기하면 안된다. 나도 처음 시작할때는 클래스를 전혀 다룰줄 몰랐다.(사실 지금도 잘 모른다...ㅠㅠ)

 

다음 시간엔 몇몇 페이지를 클래스를 이용해 처리해보는 걸 해보도록 하자

반응형

+ Recent posts