본문 바로가기
PHP 박살내기/PHP

[PHP 기초] 객체 감잡았다!

by 인생여희 2017. 9. 8.
반응형

객체에 관한 이야기


#정리내용

-객체를 이용해 코드 조직하기

-클래스와 메서드와 속성 정의

-new 지시자로 객체 생성하기

-화살표 지시자로 메서드와 속성에 접근하기

-정적 메서드 정의와 호출

-생성자로 객체 초기화하기

-예외를 발생시켜 문제점 알아내기

-예외를 포착해 문제 처리하기

-클래스를 하위클래스로 확장하기

-가시성을 변경해 속성과 메서드에 접근하는 권한 제어하기

- 네임스페이스로 코드 조직하기



-객체를 이용해 코드 조직하기

클래스메서 속성 정의

<?php

class Entree {
public $name;
public $ingredients = array();

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}



// 객체를 생성하고 $soup에 할당
$soup = new Entree;
// $soup 속성 설정
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');

// 또 다른 인스턴스를 생성하고 $sandwich에 할당
$sandwich = new Entree;
// $sandwich 속성 설정
$sandwich->name = '닭고기 샌드위치';
$sandwich->ingredients = array('닭고기', '빵');


foreach (['닭고기','레몬','빵','물'] as $ing) {
if ($soup->hasIngredient($ing)) {
print "수프의 재료: $ing.\n";
}
if ($sandwich->hasIngredient($ing)) {
print "샌드위치의 재료: $ing.\n";
}
}

//결과
수프의 재료: 닭고기. 샌드위치의 재료: 닭고기. 샌드위치의 재료: 빵. 수프의 재료: 물.



-new 지시자로 객체 생성하기

-화살표 지시자로 메서드와 속성에 접근하기



-정적 메서드 정의와 호출

class Entree {
public $name;
public $ingredients = array();

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}

public static function getSizes() {
return array('소','중','대');
}
}


$sizes = Entree::getSizes();


-생성자로 객체 초기화하기

<?php

class Entree {
public $name;
public $ingredients = array();

public function __construct($name, $ingredients) {
$this->name = $name;
$this->ingredients = $ingredients;
}

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}


// 수프 종류와 재료
$soup = new Entree('닭고기 수프', array('닭고기', '물'));

// 샌드위치 종류와 재료
$sandwich = new Entree('닭고기 샌드위치', array('닭고기', '빵'));



var_dump($soup, $sandwich);


//출력결과
object(Entree)#1 (2) { ["name"]=> string(16) "닭고기 수프" ["ingredients"]=> array(2) { [0]=> string(9) "닭고기" [1]=> string(3) "물" } } object(Entree)#2 (2) { ["name"]=> string(22) "닭고기 샌드위치" ["ingredients"]=> array(2) { [0]=> string(9) "닭고기" [1]=> string(3) "빵" } }



-예외를 발생시켜 문제점 알아내기(생성자로 예외처리)

<?php

class Entree {
public $name;
public $ingredients = array();

public function __construct($name, $ingredients) {
if (! is_array($ingredients)) {
throw new Exception('$ingredients가 배열이 아닙니다.');
}
$this->name = $name;
$this->ingredients = $ingredients;
}

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}


$drink = new Entree('우유 한 잔', '우유');
if ($drink->hasIngredient('우유')) {
print "맛있어!";
}

//결과
PHP Fatal error: Uncaught Exception: $ingredients가 배열이 아닙니다. in {{d}}construct-exception.php:9 Stack trace: #0 {{d}}exception-use.php(2): Entree->__construct('우유 한 잔', '우유') #1 {main} thrown in {{d}}construct-exception.php on line 9





try {
$drink = new Entree('우유 한 잔', '우유');
if ($drink->hasIngredient('우유')) {
print "맛있어!";
}
} catch (Exception $e) {
print "음료를 준비할 수 없습니다: " . $e->getMessage();
}

//결과






-예외를 포착해 문제 처리하기




-클래스를 하위클래스로 확장하기

<?php

class Entree {
public $name;
public $ingredients = array();

public function __construct($name, $ingredients) {
if (! is_array($ingredients)) {
throw new Exception('$ingredients must be an array');
}
$this->name = $name;
$this->ingredients = $ingredients;
}

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}



class ComboMeal extends Entree {

public function hasIngredient($ingredient) {
foreach ($this->ingredients as $entree) {
if ($entree->hasIngredient($ingredient)) {
return true;
}
}
return false;
}
}




// 수프 종류와 재료
$soup = new Entree('닭고기 수프', array('닭고기', '물'));

// 샌드위치 종류와 재료
$sandwich = new Entree('닭고기 샌드위치', array('닭고기', '빵'));






class ComboMeal extends Entree {

public function __construct($name, $entrees) {
parent::__construct($name, $entrees);
foreach ($entrees as $entree) {
if (! $entree instanceof Entree) {
throw new Exception('$entrees의 원소는 객체여야 합니다.');
}
}
}

public function hasIngredient($ingredient) {
foreach ($this->ingredients as $entree) {
if ($entree->hasIngredient($ingredient)) {
return true;
}
}
return false;
}
}



// 세트 메뉴
$combo = new ComboMeal('수프 + 샌드위치', array($soup, $sandwich));

foreach (['닭고기','물','피클'] as $ing) {
if ($combo->hasIngredient($ing)) {
print "세트 메뉴에 들어가는 재료: $ing.\n";
}
}


//결과
세트 메뉴에 들어가는 재료: 닭고기. 세트 메뉴에 들어가는 재료: 물.



-가시성을 변경해 속성과 메서드에 접근하는 권한 제어하기

<?php

class Entree {
private $name;
protected $ingredients = array();
/* $name이 private이므로 접근 수단이 필요하다. */
public function getName() {
return $this->name;
}

public function __construct($name, $ingredients) {
if (! is_array($ingredients)) {
throw new Exception('$ingredients가 배열이 아닙니다.');
}
$this->name = $name;
$this->ingredients = $ingredients;
}

public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}


- 네임스페이스로 코드 조직하기


반응형

댓글