반응형
객체에 관한 이야기
#정리내용
-객체를 이용해 코드 조직하기
-클래스와 메서드와 속성 정의
-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);
}
}
- 네임스페이스로 코드 조직하기
반응형
'PHP 박살내기 > PHP' 카테고리의 다른 글
php date 날짜 관련 함수 (0) | 2017.09.25 |
---|---|
[PHP 기초] 함수에 관해서 (0) | 2017.09.08 |
[PHP기초] 데이터 집합 - 배열다루기 (0) | 2017.09.07 |
[php 기초] 데이터:텍스트와 숫자다루기 (0) | 2017.09.06 |
[PHP기초] 클래스 맴버 만들기(static) (0) | 2017.09.06 |
댓글