본문 바로가기

기존카테고리/참조

객체지향 프로그래밍 요점 정리| PHP

● 객체생성 기본예제

<?php
 class MyClass{        // 클래스 선언
        public $color="";  // 멤버 변수 선언. public,protected,private가 올 수 있다.
        public $action="";

        function MyColor(){    // 멤버 메서드 

   echo "color is ".$this->color;  // $this는 클래스 자기자신(MyClass)을 의미한다. 즉, 자신을 참조해야 하는 일이 있다면 $this를

                                             사용해야한다. $this-> 연산자를 사용하면 자신의 멤버변수와 메서드에 접근할 수 있다. 
  }

        function MyAction(){
   echo "Action is ".$this->action;
  }
}
 $MyObj = new MyClass();   // new연산자를 사용하여 객체변수를 생성하고, 생성자를 호출한다.
 
 $MyObj->color = "흰색";   // 생성된 객체변수로 클래스내에있는 멤버들에 접근할 수 있다.
 $MyObj->action = "풍경화";
 $MyObj->MyColor();
 echo "<br/>";
 $MyObj->MyAction();
?>

--> 자바의 객체 생성과 거의 흡사하다. 자바에서는 객체변수 생성후 멤버에 접근할때 .(점)을 찍고 접근을 하는데 PHP에서는 .(점)대신에 화살표를 사용한다. $this->action 의 경우에 변수인 action에 $가 없고, this에 $가 붙는다. 또한

자바에서는 객체를 생성할때 클래스명이 사용자정의 데이터 타입으로 객체변수 앞에 붙지만 PHP에서는 $MyObj = new MyClass()와 같이 클래스명이 객체변수 앞에 붙지 않는다.

 

 

<?php
 class MyCar
 {
  var $color = "흰색";
  var $make = "현대자동차";
  var $model = "아반떼";
 }

 $myCar = new MyCar();
 echo "현재 내차는 ".$myCar->make."에서 생산된 ".$myCar->color." ". $myCar->model."이다<br/>";

 $myCar->color = "검정색";
 $myCar->make = "대우자동차";
 $myCar->model = "매그너스";

 echo "앞으로 내가 타고싶은 차는 ".$myCar->make."에서 생산된 ".$myCar->color." ".$myCar->model."이다\n";

?>

--> 위와 같이 객체를 생성하여 기존의 멤버 변수에 저장되어 있는 값들을 변경할 수 있다.

 

 

 

 

<?php
 class MyClass   // 클래스 선언
 {
  // 이곳에 멤버 변수 및 메서드를 넣는다.
 }

 $object1 = new MyClass();   // 객체 생성
 echo "object1 is an ".gettype($object1).".<br/>";  // 변수의 타입을 리턴한다.

 if(is_object($object1)){     // $object1이 객체라면,
  echo "object1은 객체입니다.";
 }
?>

--> 객체의 존재를 검사하는 예제.

 

 

 

<?php
 class myCar
 {
  var $color = "흰색";
  var $make = "현대자동차";
  var $model = "아반떼";
 }

 $car = new myCar();
 echo ("내 차는 ".$car->make."의 ".$car->color." ".$car->model."이다<br/>");  // 클래스의 멤버 변수에 접근하여 값을 얻어낸다.
?>

--> 결과,

내 차는 현대자동차의 흰색 아반떼이다

 

 

 

 

 

<?php
 class ChangeName{
 var $name = "황천길";
 function setName($name){
  $this->name=$name;
 }

 function sayHello(){
  echo "안녕하세요. 저의 이름은 ".$this->name."입니다^^<br/>";
 }
}

$newName="황토길";
$changeName = new ChangeName();   // ChangeName클래스의 객체 생성
$changeName->setName($newName);   // ChangaName클래스의 멤버메서드인 setName()메서드 호출. 매개변수를 넘긴다.
$changeName->sayHello();   // ChangeName클래스의 멤버메서드인 sayHello() 메서드 호출.
?>
--> 클래스 외부에서 메서드를 이용해 멤버 변수의 값을 변경한다.

안녕하세요. 저의 이름은 황토길입니다^^

 

 

● 생성자와 소멸자

: 생성자는 객체가 만들어질 때 호출되어 초기값을 주거나 객체에 필요한 다른 객체를 만드는 등의 초기화 작업을 수행한다. 소멸자는 클래스가 없어지기 전에 해야 하는 일들, 예를 들면 클래스에 대한 모든 참조를 지운다던가 하는 일을 할 수 있다.

 

: 생성자는 __construct()라는 이름을 가지며 _construct()가 클래스에 정의되어 있지 않으면 클래스 이름과 동일한 이름을 가진 함수를 생성자로 인식한다.

 

예1)

<?php
 class ConstructTest
 {
  
  function __construct($param)
  {
   echo "당신의 자동차는 ".$param."입니다";
  }
 }

 $car = new ConstructTest("아반떼");
?>

--> 결과,

당신의 자동차는 아반떼입니다

 

 

예2)

<?php
 class ConstructTest
 {
  
  function __construct($param)
  {
   echo "당신의 자동차는 ".$param."입니다<br/>";
  }
 }

 $car1 = new ConstructTest("아반떼");
 $car2 = new ConstructTest("소나타");
 $car3 = new ConstructTest("그랜저");
 

?>

--> 객체를 생성할 때마다 생성자가 호출된다. 결과,

당신의 자동차는 아반떼입니다
당신의 자동차는 소나타입니다
당신의 자동차는 그랜저입니다

 

 

예3)

<?php
  class ConStructor
  {
   // 3개의 멤버변수 선언
   private $hours;
   private $minutes;
   private $seconds;

   //생성자를 사용하여 멤버변수 초기화 및 setTime() 메서드를 호출.
   function __construct($hours, $minutes, $seconds)
   {
    

    $this->setTime($hours, $minutes, $seconds);
   }
   
   // 생성자로부터 시간을 넘겨받아서 멤버 변수에 할당한다.
   public function setTime($hours, $minutes, $seconds)
   {
    $this->hours = ($hours>=0&&$hours<24)?$hours:0;
    $this->minutes = ($minutes >=0 && $minutes<60)?$minutes:0;
    $this->seconds = ($seconds>=0 && $seconds<60)?$seconds:0;
   }

   // 시간을 얻어내는 getTime 메서드 설정.
   public function getTime()
   {
    return sprintf("%02d:%02d:%02d",$this->hours,$this->minutes,$this->seconds);
   }
  }

  $time = new constructor(14,12,25);   // 객체 생성 및 생성자 호출.
  echo $time->getTime();   // getTime() 메서드 출력


?>

 

예4) 소멸자 예제

<?php
 class TimeSet
 {
  private $hours;
  private $minutes;
  private $second;

  function __construct($hours, $minutes, $seconds)
  {
   $this->setTime($hours, $minute, $second);
   echo "생성자 호출!\n<br/>";
  }

  function __destruct()
  {
   echo "소멸자 호출!\n<br/>";     // 스크립트의 실행이 모두 끝난 후, 호출된다.
  }

  public function setTime($hours, $minutes, $seconds)
  {
   $this->hours = $hours;
   $this->minutes = $minutes;
   $this->seconds = $seconds;
  }

  public function toUniversalTime()
  {
   return sprintf("%02d:%02d:%02d",$this->hours, $this->minutes, $this->seconds);
  }
 }

 echo "객체 생성 전!\n<br/>";

 $time = new TimeSet(22,40,38);
 echo "객체 생성 후!\n<br/>";
 
 echo $time->toUniversalTime()."\n<br/>";

 echo "스크립트 종료!\n<br/>";
?>
 --> 결과,

객체 생성 전!
생성자 호출!
객체 생성 후!
22:00:00
스크립트 종료!
소멸자 호출!
--> 스크립트의 실행이 끝난 후에 이미 생성되었던 객체가 메모리에서 제거되면서 소멸자가 호출되기 때문에 가장 마지막에 출력이 되는것을 볼 수있다.

 

 

예5) 스크립트 종료전 해당 객체를 삭제하는 예

<?php
 class TimeSet
 {
  private $hours;
  private $minutes;
  private $second;

  function __construct($hours, $minutes, $seconds)
  {
   $this->setTime($hours, $minute, $second);
   echo "생성자 호출!\n<br/>";
  }

  function __destruct()
  {
   echo "소멸자 호출!\n<br/>";     // 스크립트의 실행이 모두 끝난 후, 호출된다.
  }

  public function setTime($hours, $minutes, $seconds)
  {
   $this->hours = $hours;
   $this->minutes = $minutes;
   $this->seconds = $seconds;
  }

  public function toUniversalTime()
  {
   return sprintf("%02d:%02d:%02d",$this->hours, $this->minutes, $this->seconds);
  }
 }

 echo "객체 생성 전!\n<br/>";

 $time = new TimeSet(22,40,38);
 echo "객체 생성 후!\n<br/>";
 
 $time = NULL;         // NULL값을 입력하여 참조변수가 더 이상 해당 객체를 가르키지 않도록한다. 

// unset($time);  // unset() 함수를 이용하여 객체를 제거할 수도 있다.

 echo $time->toUniversalTime()."\n<br/>";

 echo "스크립트 종료!\n<br/>";
?>

--> 결과,

객체 생성 전!
생성자 호출!
객체 생성 후!
소멸자 호출!

Fatal error: Call to a member function toUniversalTime() on a non-object in /home/hjs6877/htdocs/php/bbcom/TimeSet.php on line 39
--> 객체를 삭제하였기 때문에 객체로 접근하는 구문은 에러가 발생한다.

 

 

 

 

 

● 클래스내의 멤버 변수에 접근하기 위한  함수

: 객체를 생성한 후에 클래스내의 멤버변수에 바로 접근하는것은 보안상 좋지 못한 방법이다. 아래와 같이 멤버 변수에 접근해서 초기화하기 위한 함수와 값을 리턴해주는 함수를 만들어 사용하는것이 올바른 방법이다.

 

예1)

<?php
 class MemberSetting
 {
  var $color;
  function setColor($color)
  {
   $this->color = $color;
  }

  function getColor()
  {
   return $this->color;
  }
 }

 $ms = new MemberSetting();    // 객체 생성
 $ms->setColor("yellow");         // 객체에 점찍고 setColor() 함수 호출하면서 매개변수의 값을 넘긴다.
 $colorName = $ms->getColor();  // 객체에 점찍고 getColor() 함수를 호출하여 리턴값을 되돌려받아서 $colorName에 저장한다.
 echo "This color is ".$colorName."<br/>";
?>

--> 결과,

This color is yellow

 

 

 

● 접근제한자 및 상속의 기본 예

예1)

<?php
 class MyClass
 {
  public $HelloOne="Hello One";       // 접근제한자 키워드를 붙이게되면 var 키워드가 생략된다.
  protected $HelloTwo="Hello Two";
  private $HelloThree="Hello Three";

  function printHello()
  {
   echo "<br>MyClass:public : ".$this->HelloOne;           // 자기자신의 클래스 안에서는 모든 접근제한자가 다 허용이 되므로 모두

                                                                                다 출력이 된다.
   echo "<br>MyClass:protected : ".$this->HelloTwo;
   echo "<br>MyClass:private : ".$this->HelloThree;
  }
 }

 

  class MyClassMain extends MyClass     // MyClass를 상속한다.
 {
  function printHello()          // MyClass를 상속했기때문에 똑같은 이름의 메서드를 재정의해서 사용할 수 있다.(메서드 오버라이딩)
  {
   echo "<br>MyClassMain:public : ".$this->HelloOne;        // public은 클래스 밖이든 어디든 접근이 가능하므로, 출력된다.
   echo "<br>MyClassMain:protected : ".$this->HelloTwo;   // protected상속을 받았을때 클래스 외부에서 접근이 가능하므로,

                                                                                         출력된다.
   echo "<br>MyClassMain:private : ".$this->HelloThree;    // private은 상속받았다 하더라도 무조건 자기자신의 클래스 내부에서만

                                                                                         사용가능하기 때문에 출력이 되지 않는다. 
  }
 }

 $obj1=new MyClass();      // 객체(변수) 생성
 $obj1->printHello();

 $obj2=new MyClassMain(); // 객체(변수) 생성
 $obj2->printHello();
?>

 

 

예2)

<?php
 class Father{
  var $orgName="황윤식";
  function Father($changeName){          // Father 클래스의 생성자를 재정의 했다.
   $this->orgName = $changeName;
  }

  function sayHello(){
   echo "저의 새로운 이름은 ".$this->orgName."입니다.__a<br/>";
  }
}
 class Son extends Father{
  // Father 클래스를 상속한다.
 }

 $objSon = new Son("황정식");            // Son클래스의 생성자를 호출하지만 상속을 받은 상태이기 때문에 매개변수 있는 생성자를

                                                       찾는다. 그렇기때문에 Father클래스의 생성자에게 매개변수의 값을 넘긴다.
 $objSon->sayHello();   // Son이 Father에게 상속을 받았기때문에 Father클래스의 sayHello()를 호출할 수 있다.
?>

 

 

● 메서드 오버라이딩 기본 예

예)1

<?php
 class FatherName{
  var $oldName="창피해";
  function FatherName($newName){
   $this->oldName=$newName;
  }

  function sayHello(){
   echo "제이름은 ".$this->oldName."입니다.<br/>";
  }
}

 class SonName extends FatherName{
  function sayHello(){                                  // 상속으로 인해 sayHello() 메서드를 SonName클래스에서 재정의 했다.
   echo "제 이름을 말하기가 부끄러워요...ㅋ";
  }
 }

 $objSon = new SonName("안창피해");         // SonName 클래스는 매개변수 없는 기본 생성자가 호출되므로, 매개변수는

                                                               FatherName클래스의 생성자로 전달된다.
 $objSon->sayHello();                                // SonName 클래스에 재정의된 sayHello() 메서드가 있기 때문에 SonName의

                                                                sayHello() 메서드가 호출된다.
?> 

 

 

 

 

● final을 사용하여 상속과 오버라이딩 막기

    

<?php
 final class FatherClass          // 상속 되지 않는다.
 {
  var $name = "아버지";
  final function Name()        // 오버라이딩 되지 않는다.
  {
   echo "이 클래스는 ".$this->name." 클래스 입니다.<br/>";
  }
 }

 class SonClass extends FatherClass
 {
  var $name = "아들";
  function Name()
  {
   echo "이 클래스는 ".$this->name." 클래스 입니다.<br/>";
  }
 }

 $son = new SonClass();
 $son->Name();
?>

 

--> final이라는 키워드가 상위클래스의 메서드에 붙으면 하위클래스에서 오버라이딩을 할 수 없으며,  상위 클래스에 final이 붙으면 상속또한 되지 않는다.

 

--> 결과,

Fatal error: Cannot override final method FatherClass::Name()

 

Fatal error: Class SonClass may not inherit from final class (FatherClass)

 

 

 

 

 

● 추상 클래스와 추상 메서드 사용

: 추상클래스란 abstract로 선언된 클래스를 뜻하며 오직 상속을 하는 용도로만 사용할 수 있다. 메서드의 몸체부분만 선언된 메서드를 추상메서드라고 하는데 추상메서드를 하나라도 가지고 있는 클래스는 추상 클래스로 선언된다. 만일 추상메서드가 protected로 선언되었다면 상속하는 클래스도 반드시 그 메서드를 public이나 protected 접근자로 재정의해야한다.

 

<?php
 abstract class AbstractClass{  // abstract로 추상 클래스를 선언한다.
  abstract public function test();  // abstract로 추상메서드를 선언한다.
}

class ImplementedClass extends AbstractClass{
 public function test(){
  echo "AbstractClass를 상속받아 test()메서드를 재정의하였다.\n";
 }
}

$o = new ImplementedClass();    // ImplementedClass 클래스의 객체 생성.
$o->test();   // 객체를 사용하여 test() 메서드 호출.
?>

 

 

 

 

●  인터페이스 구현

<?php
 interface FatherClass
 {
  function Name();
 }

 class SonClass implements FatherClass
 {
  function Name()
  {
   echo "Name() 메서드가 인터페이스로부터 구현되어 정의되었다.";
  }

 }
 
 $son = new SonClass();
 $son->Name();

?>

 --> 자바에서와 마찬가지로 메서드의 몸체만으로 구성된 인터페이스를 구현할 수 있다. 만약 인터페이스에 명시된 메서드를 하나라도

구현하지 않으면 에러가 발생한다. 인터페이스는 다중상속의 우회적인 방법이다.

 

 

 

 

 

● 스태틱 멤버와 클래스 상수 사용

: 스태틱 멤버 변수는 static 키워드를 사용하여 선언하고, 클래스 상수는 const 키워드를 사용하여 선언한다. 이때 const로 선언된 클래스 상수는 변수가 아니기 때문에 $를 붙이지 않는다.

 

<?php
 class MyClass{
  const SUCCESS = "오호! 성공하셨네요~<br/>";    // 상수는 통상적으로 대문자로 선언한다.
  const FAILURE = "이런.. 실패하셨군요..<br/>";
}
echo MyClass::SUCCESS;
echo MyClass::FAILURE;
?>

 

 

 

 

● 기본적인 객체지향 함수

 ① class_exists() 함수

 : 클래스가 선언되었는지 확인하는 함수로서 class_exists(클래스 이름);이라고 실행했을때 클래스 이름이 있으면 "true", 없으면 "false"값을 반환한다.

 

 ② get_class() 함수

 : 객체의 클래스 이름을 반환한다. get_class($객체명); 이라고 실행했을때 이 객체에 해당하는 클래스 이름을 반환한다.

 

 ③ method_exists() 함수

 : 클래스 안에 메서드가 선언되어있는지 확인하는 함수로서 method_exists($객체명,"메서드명"); 이라고 실행했을때, 해당 메서드가 있으면 "true" 값, 즉 1이 출력된다.



원문: http://cafe.daum.net/ITVillage/ClWx/68?q=php%20setTime()&re=1