● 객체생성 기본예제
<?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