인스턴스 vs 정적 프로퍼티
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 15번째.
클래스에서 프로퍼티를 생성할 때, 해당 프로퍼티가 각 개별 객체에 속할지 아니면 클래스 자체에 속할지를 결정해야 합니다. 이러한 구분이 바로 인스턴스 프로퍼티와 정적 프로퍼티의 차이입니다.
인스턴스 속성이 기본값입니다. 각 객체는 해당 속성의 고유한 복사본을 가지며, 한 객체에서 이를 변경해도 다른 객체에는 영향을 미치지 않습니다:
<?php
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name . "\n";
echo $bob->name . "\n";
출력:
Alice
Bob
정적 프로퍼티는 특정 객체가 아니라 클래스에 속합니다. static 키워드를 사용하여 선언하며, 객체와 함께 ->를 사용하는 대신 클래스 이름과 함께 ::를 사용하여 접근합니다:
<?php
class User {
public static $count = 0;
public $name;
public function __construct($name) {
$this->name = $name;
self::$count++;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo User::$count;
출력:
2
$count가 모든 인스턴스에서 어떻게 공유되는지 확인해 보세요. 새로운 User를 생성할 때마다 동일한 $count 변수가 증가합니다. 클래스 내부에서는 정적 속성을 참조하기 위해 self::$count를 사용합니다.
핵심 포인트: 각 객체가 고유한 값을 필요로 할 때는 인스턴스 프로퍼티를 사용하세요. 인스턴스 수를 세거나 설정을 저장하는 것과 같이, 클래스의 모든 객체 간에 데이터를 공유해야 할 때는 정적 프로퍼티를 사용하세요.
챌린지
쉬움인스턴스 속성(각 방문자에게 고유함)과 정적 속성(모든 방문자가 공유함)의 차이점을 보여주는 방문자 추적 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Visitor.php— 개별 방문자를 추적하고 총 방문자 수를 유지하는Visitor클래스를 정의합니다. 각 방문자는 자신만의$name속성(인스턴스 속성)을 가져야 하며,$totalVisitors속성은 모든 인스턴스에서 공유되어야 합니다(정적 속성). 생성자는 이름을 받아 설정하고 총 방문자 수를 증가시킵니다."[name] is visitor #[totalVisitors]"를 반환하는getInfo()메서드를 추가하세요.main.php— Visitor 클래스 파일을 포함한 다음,"Alice","Bob","Charlie"라는 이름으로 세 명의 방문자를 순서대로 생성합니다. 세 명을 모두 생성한 후, 각 방문자에 대해getInfo()를 호출한 결과를 출력하고(각각 별도의 줄에),Visitor::$totalVisitors를 사용하여 클래스에서 직접 정적 속성에 액세스하여 총 방문자 수를 출력하세요.
클래스 내부에서는 self::$propertyName을 사용하여 정적 속성에 액세스하고, 클래스 외부에서는 ClassName::$propertyName을 사용한다는 점을 기억하세요. 인스턴스 속성은 평소와 같이 $this->propertyName으로 액세스합니다.
출력 결과에는 각 방문자와 할당된 번호가 표시되어야 하며, 마지막 줄에는 최종 총 합계가 표시되어야 합니다.
치트 시트
인스턴스 속성은 각 개별 객체에 속하며, 정적 속성은 클래스 자체에 속하고 모든 인스턴스에서 공유됩니다.
인스턴스 속성:
각 객체는 속성의 자체 복사본을 가집니다:
<?php
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name; // Alice
echo $bob->name; // Bob
정적 속성:
static 키워드로 선언되며 모든 인스턴스에서 공유됩니다:
<?php
class User {
public static $count = 0;
public $name;
public function __construct($name) {
$this->name = $name;
self::$count++;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo User::$count; // 2
정적 속성 접근하기:
- 클래스 내부:
self::$propertyName - 클래스 외부:
ClassName::$propertyName
인스턴스 속성 접근하기:
- 클래스 내부:
$this->propertyName - 클래스 외부:
$object->propertyName
직접 해보기
<?php
// Visitor 클래스 포함
require_once 'Visitor.php';
// TODO: "Alice", "Bob", "Charlie"라는 이름의 방문자 세 명을 생성합니다 (해당 순서대로)
// TODO: 각 방문자에 대해 getInfo()의 결과를 출력합니다 (각각 별도의 줄에)
// TODO: Visitor::$totalVisitors를 사용하여 총 방문자 수를 출력합니다
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션3클래스 프로퍼티
인스턴스 vs 정적 프로퍼티클래스 내 상수정적 메서드와 프로퍼티Private 및 Protected 프로퍼티Readonly 프로퍼티 (PHP 8.1)요약 - 은행 계좌 관리 프로그램