객체 지향 프로그래밍은 대규모 소프트웨어 프로젝트, 특히 여러 사람이 참여하는 프로젝트에 대한 솔루션을 제공하도록 설계되었습니다. 소스 코드가 10,000줄 이상으로 늘어나면 모든 변경으로 인해 바람직하지 않은 부작용이 발생할 수 있습니다. 제1차 세계 대전 이전의 유럽.
//haohappy 참고: 이는 모듈 간의 상관 관계가 너무 높고 상호 의존성이 너무 강하다는 것을 의미합니다. 한 모듈을 변경하면 다른 모듈도 그에 따라 변경됩니다.
로그인을 처리하는 모듈이 신용 카드 처리 모듈이 데이터베이스 연결을 공유하도록 허용한다고 상상해 보십시오. 물론 다른 데이터베이스 연결을 만드는 데 드는 비용을 절약하는 것은 좋은 일입니다. 그러나 때로는 로그인 처리 모듈이 데이터베이스 연결 중 하나를 변경합니다. 변수의 이름은 둘 사이의 합의를 깨뜨리고 신용 카드 모듈 처리에 오류를 일으킬 수 있으며, 이는 결국 청구서를 처리하는 모듈에 오류로 이어질 수 있습니다. 머지 않아 시스템의 관련없는 모든 모듈에서 오류가 발생할 수 있습니다. 따라서
저는 대부분의 프로그래머가 결합과 캡슐화에 대해 다소 감사하고 있다고 생각합니다. 결합은 두 모듈 간의 의존도를 나타내는 척도입니다. 우리는 모듈을 꺼낼 수 있기를 원합니다. 기존 프로젝트를 다른 프로젝트에 사용하는 경우
에도 다른 모듈에 대한 영향을 걱정하지 않고 특정 모듈 내에서 대규모 변경을 수행하기를 희망합니다. 모듈은 이러한 솔루션을 제공할 수 있습니다. 상대적으로 독립적이며 모듈 간의 데이터 통신은 인터페이스를 통해 수행됩니다. 모듈은 서로의 변수 이름을 스누핑하지 않고 함수를 통해 요청을 정중하게 보냅니다.
PHP 및 많은 절차 지향 원칙입니다. 언어 모듈을 통해 가상의 웹을 구축하는 데 방해가 되는 것은 없습니다. 객체 지향 프로그래밍
에서는
프로그래머가 객체 지향 프로그래밍의 원칙을 위반하지 않는 방법입니다.메소드와 속성이 있습니다. 추상적인 관점에서 메소드는 객체의 동작이고, 속성은 객체의 특성입니다. 프로그래밍 관점에서 메소드는 함수이고 속성은 변수입니다. 지향 시스템에서는 각 부분이 객체입니다. 시스템은 객체와 메소드를 통한 객체 간의 관계로 구성됩니다.
클래스는 객체의 속성을 정의합니다. 쿠키 객체 세트를 굽는 경우 클래스는 쿠키 기계가 됩니다. 클래스의 속성과 메소드를 멤버라고 합니다.
각 언어는 객체에 액세스하는 다양한 방법을 제공합니다. PHP는 C++ 개념을 빌려서 클래스 아래에 함수와 변수를 포함합니다. 식별자. PHP가 처음 설계되었을 때, 그리고 PHP3가 개발되었을 때에도 PHP는 100,000줄의 코드를 초과하는 대규모 프로젝트를 개발하는 기능을 제공할 의도가 없었습니다. PHP와 Zend 엔진의 개발로 대규모 프로젝트 개발이 가능해졌지만, 프로젝트 규모에 관계없이 클래스에서 스크립트를 작성하면 코드 재사용이 가능해집니다. 특히 코드를 다른 사람과 공유하려는 경우 이는 좋은 생각입니다.
객체에 대한 아이디어는 컴퓨터 과학에서 가장 흥미로운 개념 중 하나입니다. 처음에는 마스터하기가 어렵지만 일단 마스터하고 나면 마음으로 생각하는 것이 매우 자연스럽게 느껴질 것이라고 장담합니다.
PHP5의 객체 모델
PHP5는 단일 상속, 제한된 액세스 및 오버로드 가능한 객체 모델을 가지고 있습니다. 이 장의 뒷부분에서 자세히 설명할 "상속"에는 클래스 간의 부모-자식 관계도 포함됩니다. 멤버를 비공개로 선언하여 외부 클래스의 액세스를 허용하지 않을 수 있습니다. 마지막으로 PHP는 하위 클래스가 상위 클래스의 멤버를 오버로드하도록 허용합니다.
PHP5의 객체 모델은 참조로 전달되는 다른 데이터 유형과 다르게 객체를 처리합니다. 참조 기반 객체 모델은 이 장의 마지막 부분에서 자세히 설명할 것입니다. 이는 PHP5의 가장 중요한 새로운 기능입니다.
객체 모델에는 효율성이 향상된다는 추가적인 이점이 있습니다.
이전 버전의 PHP에서는 기본적으로 스크립트가 개체를 복사했지만 이제PHP5
에서는 불필요한 복사를 방지하여 스크립트 실행 효율성이 향상되었습니다. 복잡성을 가져오며 실행 효율성에도 이점을 제공합니다. 동시에 복사를 줄이면 예약할 수 있는 메모리가 줄어듭니다. 이는 다른 작업을 위해 더 많은 메모리를 확보하므로 효율성도 향상됩니다
. 행복한 개발은 객체가 파괴되기 전에 클래스 메소드를 파괴 실행하는 것을 허용하는 것입니다. 이것은 또한 객체에 대한 참조가 없을 때 PHP가 명확하게 알 수 있도록 하고 여유 메모리를 할당할 수 있다는 점에서 매우 유익합니다.
PHP5의 메모리 관리
객체
전송
PHP5는 Zend Engine II를 사용하며 객체는 다른 일반 변수처럼 Zval에 저장되지 않습니다. ). Zval에는 내용(값)이 아닌 객체의 포인터만 저장됩니다. 객체를 복사하거나 객체를 매개변수로 함수에 전달할 때 데이터를 복사할 필요가 없습니다. 동일한 객체 포인터를 유지하고 이 특정 객체가 이제 다른 zval을 통해 가리키는 것을 객체 저장소에 알리십시오. 객체 자체가 객체 저장소에 있기 때문에 객체에 대한 모든 변경 사항은 객체에 대한 포인터를 보유하는 모든 zval 구조에 영향을 미칩니다. 대상 객체에 대한 모든 변경 사항은 소스 객체에 영향을 미치므로 프로그램에 나타납니다. .이것은 PHP 객체가 항상 참조에 의해 전달되는 것처럼 보이게 하므로 PHP의 객체는 기본적으로 "참조"에 의해 전달되며 더 이상 PHP4에서처럼 선언하기 위해 &를 사용할 필요가 없습니다.
일부 언어(가장 일반적으로 C)의가비지 수집 메커니즘
에서는 데이터 구조를 생성할 때 메모리 할당을 명시적으로 요청해야 합니다. 메모리를 할당하면 변수에 정보를 저장할 수 있습니다. 동시에, 변수 사용이 끝나면 메모리를 해제해야 합니다. 그래야 기계가 다른 변수를 위한 메모리를 확보하고 메모리 부족을 방지할 수 있습니다.
PHP는 자동으로 메모리를 관리하고 더 이상 필요하지 않은 개체를 지울 수 있습니다. PHP는 참조 카운팅이라는 간단한 가비지 수집 메커니즘을 사용합니다. 각 개체에는 참조 카운터가 포함되어 있으며 개체에 연결된 각 참조는 카운터를 1씩 증가시킵니다. 참조가 생활 공간을 벗어나거나 NULL로 설정되면 카운터가 1씩 감소합니다. 객체의 참조 카운터가 0에 도달하면 PHP는 더 이상 객체를 사용할 필요가 없다는 것을 알고 객체가 차지하는 메모리 공간을 해제합니다.
예:
<?php
클래스 사람{}
function sendEmailTo(){}
$haohappy = new Person( );
// 새 객체 생성: 참조 횟수 참조 횟수 = 1
$haohappy2 = $hao행복;
// 참조로 복사: 참조 횟수 = 2
설정되지 않음($haohappy);
// 참조 삭제: 참조 횟수 = 1
sendEmailTo($haohappy2);
// 참조로 객체 전달:
// 함수 실행 중:
// 참조 횟수 = 2
//실행 후:
// 참조 횟수 = 1
unset($haohappy2);
// 참조 삭제: 참조 횟수 = 0 메모리 공간 자동 해제
?>