이 글은 "Yii 프레임워크 분석(2) - CComponent 클래스 분석"의 보충 자료로 활용될 수 있습니다.
CComponent 클래스는 YII 프레임워크의 구성 요소 기반 및 이벤트 중심 프로그래밍을 위한 기반을 제공합니다. YII 프레임워크의 대부분의 클래스는 CComponent 클래스를 기본 클래스로 사용합니다. CComponent 클래스는 하위 클래스에 대해 3가지 기능을 제공합니다.
1. 멤버 변수 확장
다음과 같은 두 개의 멤버 함수(getXXX/setXXX)를 정의하여 멤버 변수를 정의합니다.
공용 함수 getText() {…}
public function setText {…}
이것은 $text 멤버 변수를 정의하는 것과 동일하며 다음과 같이 호출할 수 있습니다.
$a=new CComponent; $a=$component->text; // 等价于$a=$component->getText(); $component->text='abc'; // 等价于$component->setText('abc');
CComponent는 매직 메소드를 사용합니다. "멤버 변수 확장" 기능을 구현하기 위해 __get 및 __set를 사용합니다. 클래스 자체에 존재하지 않는 멤버 변수가 연산되면 PHP는 해당 클래스의 __get 및 __set 메서드를 호출하여 처리합니다. CComponent는 이 두 가지 매직 메서드를 사용하여 "멤버 변수 확장" 기능을 구현합니다. 다음 그림은 두 개의 멤버 변수 active 및 sessionName을 추가하는 CComponent의 하위 클래스를 설명합니다. 이 그림은 이러한 두 멤버 변수의 호출 프로세스를 설명합니다.
(참고: 매직 메소드 __get 및 __set 사용에 대해서는 PHP 기본 클래스 및 객체 13 - 오버로딩을 참조하세요.)
객체지향 프로그래밍에서는 멤버 변수를 직접 정의하는 것만으로도 충분합니다. 왜 CComponent는 두 개의 함수를 정의하여 멤버 변수를 구현합니까? 주된 이유 중 하나는 멤버 변수의 "지연 로딩"이 필요하기 때문입니다. 일반적으로 클래스의 멤버 변수는 생성자 또는 초기화 함수에서 균일하게 할당되지만 웹 요청을 처리하는 동안 모든 멤버 변수가 할당되는 것은 아닙니다. 예를 들어 App 클래스는 $cache 및 $db라는 두 개의 멤버 변수를 정의합니다($cache는 캐시 개체이고 $db는 데이터베이스 링크 개체입니다). 이 두 개체는 App 클래스가 초기화될 때 생성되지만 웹의 경우 웹사이트의 일부 페이지에서는 캐시를 통해 콘텐츠를 얻을 수 있으므로 실제로 데이터베이스 링크 개체를 생성할 필요가 없습니다. App이 CComponent의 하위 클래스로 정의된 경우 App 클래스에는 getCache/getDb라는 두 가지 메소드가 정의되어 있어 db 멤버 변수가 처음 사용될 때 데이터베이스 링크를 초기화하기 위해 getDb 함수가 호출됩니다. - 즉, 처음 사용할 때 초기화합니다. 지연된 로딩으로 인해 하나의 함수 호출이 추가되지만 불필요한 멤버 변수 초기화를 줄일 수 있고(일반적으로 웹 사이트의 액세스 속도가 향상됨) 코드를 더 쉽게 유지 관리하고 확장할 수 있습니다.
지연 로딩은 "멤버 변수 확장" 기능의 가장 중요한 용도여야 합니다. 물론 이 기능에는 다른 용도도 있을 것입니다. 멤버 변수를 조작할 때 실제로 getXXX 및 setXXX 멤버를 호출하는 것입니다. 함수, 당신은 코드 조각을 호출하고 있습니다!
2. 이벤트 모델
이벤트 모델은 디자인 패턴의 "관찰자 패턴"입니다. 객체의 상태가 변경되면 이 객체가 다른 객체에 이벤트를 알릴 수 있습니다.
이벤트 모델을 사용하려면 다음 세 단계를 구현해야 합니다. 1. 이벤트를 정의합니다. 2. 이벤트 핸들러를 등록합니다. 3. 이벤트를 트리거합니다.
CComponent 하위 클래스는 public function onClick(){...}과 같이 on으로 시작하는 멤버 함수를 정의하여 이벤트를 정의한 다음, attachmentEventHandler 멤버 함수를 호출하여 이벤트 핸들러를 등록합니다(여러 이벤트 핸들러를 등록할 수 있음). ) , 마지막으로 raiseEvent를 호출하여 이벤트를 트리거합니다.
CComponent 클래스는 전용 멤버 변수를 사용하여 이벤트와 이벤트 처리를 위한 모든 핸들을 저장합니다. 이 멤버 변수는 해시 테이블의 키가 이벤트 이름이고 값입니다. 해시 테이블의 이벤트 처리 기능 연결 목록입니다.
3. 동작 클래스 바인딩
클래스에 기능을 추가하는 방법에는 두 가지가 있습니다. 1. 이 클래스의 코드를 직접 수정하고 일부 멤버 함수와 멤버 변수를 추가합니다. 2. 하위 클래스를 통해 파생 및 확장합니다. 분명히 두 번째 방법은 유지 관리 및 확장이 더 쉽습니다. 여러 기능을 클래스에 추가해야 하는 경우(서로 다른 시간에 여러 사람) 다중 수준 파생이 필요하며 이는 유지 관리 비용을 분명히 증가시킵니다.
CComponent는 클래스 정보를 확장하기 위해 특별한 방법, 즉 동작 클래스 바인딩을 사용합니다. 동작 클래스는 CBehavior 클래스의 하위 클래스입니다. CComponent는 CBehavior 클래스의 멤버 함수와 멤버 변수를 하나 이상 추가하고 필요하지 않은 경우 일부 CBehavior 클래스를 제거할 수 있습니다. 다음은 간단한 예입니다.
//Calculator 클래스
class Calculator 확장 CBehavior
{
public function add($x, $y) { return $x + $y }
public; function sub($x, $y) { return $x - $y; }
...
}
$comp = new CComponent();
//내 클래스용 계산기 기능 추가
$comp->attachbehavior('calculator', new Calculator());
$comp->add(2, 5);
$comp->sub(2 , 5);
CComponent는 세 가지 매직 메소드인 __get, __set 및 __call을 통해 "동작 클래스 바인딩"을 구현합니다(이 세 가지 매직 메소드 사용에 대한 자세한 내용은 PHP 기본 클래스 및 객체 13 - 오버로딩 참조). 호출 시 "정의된" 기능 CComponent 클래스에 존재하지 않는 멤버 변수 및 멤버 메서드가 있는 경우 CComponent 클래스는 이러한 세 가지 매직 메서드를 통해 "동적으로 바인딩된 동작 개체"를 검색합니다. 즉, 존재하지 않는 멤버 변수와 멤버 메서드를 "동적 바인딩 개체"로 라우팅합니다.
CComponent 클래스의 특징은 3가지 문장으로 요약됩니다.
설정 시 객체 구성이 더 좋습니다. 개체의 멤버 변수는 실제로 코드를 실행합니다.
2. 개체의 내부 상태가 변경되면 다른 개체에 알릴 수 있습니다.
3. 객체에 멤버 변수와 멤버 함수를 추가할 수 있고, 객체의 상태를 모니터링할 수도 있습니다.
위는 Yii 프레임워크 분석입니다(5) - CComponent 기본 클래스의 내용에 대해 이야기해보겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!