>백엔드 개발 >PHP 튜토리얼 >객체 지향 PHP의 객체 지향 프로그래밍: 대규모 PHP 프로젝트로 가는 길

객체 지향 PHP의 객체 지향 프로그래밍: 대규모 PHP 프로젝트로 가는 길

WBOY
WBOY원래의
2016-07-29 08:35:27908검색

이 기사에서는 PHP의 객체지향 프로그래밍(OOP)을 소개합니다. 객체 지향 개념을 사용하여 더 적은 코드로 더 나은 프로그램을 작성하는 방법을 보여 드리겠습니다. 모두에게 행운을 빕니다.
객체지향 프로그래밍의 개념은 저자마다 관점이 다릅니다. 객체지향 언어가 갖춰야 할 것이 무엇인지 상기시켜드리겠습니다.
- 데이터 추상화 및 정보 은폐
- 상속
- 다형성
PHP에서 캡슐화를 위해 클래스를 사용하는 방법:
class Something {
// OOP에서 클래스 이름은 일반적으로 대문자로 시작합니다.
var $x; > function setX($v) {
// 메소드는 소문자로 시작한 다음 소문자를 사용하여 구분합니다.
// 메소드 이름의 단어 예시 getValueOfArea()
$this->x =$v; 🎜> }
function getX() {
return $this->x;
}
}
?> 표준을 갖는 것은 항상 좋습니다.
PHP에서 클래스의 데이터 멤버는 "var"을 사용하여 정의됩니다. 데이터 멤버에는 값이 할당될 때까지 유형이 없습니다. 데이터 멤버는 정수, 배열, 연관 배열(연관 배열) 또는 심지어 객체일 수도 있습니다. 메소드는 클래스의 함수로 정의됩니다. 메소드의 데이터 멤버에 액세스하려면 다음과 같이 $this->name을 사용해야 합니다. 그렇지 않으면 해당 메소드에 대한 함수의 지역 변수입니다.
new를 사용하여 객체 생성
$obj = new Something;
그런 다음 멤버 함수를 사용합니다.
$obj->setX(5)
$see = $obj-> getX ()
setX 멤버 함수는 객체(클래스가 아님)의 멤버 변수에 5를 할당한 다음 getX는 값 5를 반환합니다.
또한 객체 참조를 사용하여 멤버 변수에 액세스할 수도 있습니다. 예: $obj- >x=6; 그러나 이는 객체 지향 프로그래밍에 대한 좋은 접근 방식이 아닙니다. 멤버 변수의 값을 설정하려면 멤버 함수를 사용하고, 멤버 변수를 읽으려면 멤버 함수를 사용해야 한다고 주장합니다. 멤버 함수를 사용하지 않고는 멤버 변수에 액세스할 수 없다고 생각한다면 훌륭한 객체 지향 프로그래머가 될 것입니다. 하지만 불행하게도 PHP 자체에는 변수를 비공개로 선언할 수 있는 방법이 없으므로 잘못된 코드가 존재할 수 있습니다.
PHP의 상속은 확장을 사용하여 선언됩니다.
class Another extends Something {
var $y
function setY($v) {
// 메소드는 소문자로 시작한 다음 소문자를 사용하여 구분합니다.
/ /메서드 이름 예시 GetValueofarea ()
$ this-& gt; $ v
}
함수 Gety () {
Return $ this- & gt; > }
}
?>
이런 식으로 "Another" 클래스의 객체에는 상위 클래스의 모든 멤버 변수와 메서드 함수는 물론 자신의
멤버 변수와 멤버 함수도 포함됩니다. . 예:
$obj2=new Another;
$obj2->setY(7)
다중 상속은 지원되지 않습니다. A 클래스가 여러 클래스에서 상속되도록 합니다.
상속된 클래스에서 이를 재정의하여 메서드를 재정의할 수 있습니다. "Another"에서 getX를 재정의하면 "Something"에서 멤버 함수 getX에 더 이상 액세스할 수 없습니다. class 부모 클래스와 이름이 같은 멤버 변수를 선언하면 상속된 클래스의 변수가 부모 클래스와 이름이 같은 변수를 숨깁니다.
클래스의 생성자를 정의할 수 있습니다. 생성자는 클래스와 동일한 이름을 가진 멤버 함수이며 클래스의 객체를 생성할 때 호출됩니다.
class Something {
var $x
function Something($y) {
$this->x=$y; function setX($v) {
$this->x=$v;
}
function getX() {
return $this->x; }
?>
따라서 다음 메서드를 사용하여 객체를 만들 수 있습니다.
$obj=new Something(6)
생성자는 값 5를 멤버 변수 x에 자동으로 할당합니다. 생성자와 멤버 함수 모두 일반 PHP 함수이므로 기본 매개변수를 사용할 수 있습니다.
function Something($x="3",$y="5")
다음:
$obj=new Something() // x=3 및 y=5
$obj =new Something(8); // x=8 및 y=5
$obj=new Something(8,9); // x=8 및 y=9
기본 매개변수를 정의하는 방법과 C 동일 , 따라서 Y에 값을 전달할 수 없지만 X가 기본값을 사용하도록 합니다. 인수는 왼쪽에서 오른쪽으로 전달되며 더 이상 인수가 없으면 함수는 기본 인수를 사용합니다.
상속받은 클래스의 생성자를 호출해야만 상속받은 클래스의 객체가 생성되고, 상위 클래스의 생성자는 호출되지 않는 것이 다른 객체지향 언어와는 다른 PHP의 특징입니다. 생성자 호출 체인이 객체 지향적이기 때문입니다. 기본 클래스의 생성자를 호출하려면 상속 클래스의 생성자에서 명시적으로 호출해야 합니다. 이는 상위 클래스의 모든 메소드를 상속된 클래스에서 사용할 수 있기 때문에 작동합니다.
function Another() {
$this->y=5
$this->Something() //기본 클래스 생성자에 대한 명시적 호출
} 
?>
객체 지향 프로그래밍의 좋은 메커니즘은 추상 클래스를 사용하는 것입니다. 추상 클래스는 인스턴스화할 수 없지만 상속된 클래스에 대한 인터페이스를 정의하는 데 사용됩니다. 디자이너는 종종 추상 클래스를 사용하여 프로그래머가 특정 기본 클래스에서만 상속하도록 하여 새 클래스에 필요한 기능이 있는지 확인할 수 있지만 PHP에는 이를 수행하는 표준 방법이 없습니다.
기본 클래스를 정의할 때 이 기능이 필요하면 생성자에서 "die"를 호출하여 인스턴스화할 수 없도록 할 수 있습니다. 이제 추상 클래스의 함수를 정의하고 각 함수에서 "die"를 호출합니다. 프로그래머가 기본 클래스의 함수를 재정의하지 않고 직접 호출하면 오류가 발생합니다. 추가적으로, PHP에는 유형이 없기 때문에 기본 클래스에서 상속된 상속 클래스에서 일부 개체가 생성되는지 확인해야 합니다. 따라서 기본 클래스에 메서드를 추가하여 클래스를 식별하고("일부 식별자" 반환) 이를 확인해야 합니다. 당신이 수신할 때 매개변수로 객체에 유용합니다. 그러나 불량 프로그램에 대한 해결책은 없습니다. 왜냐하면 상속된 클래스에서 이 함수를 재정의할 수 있기 때문입니다. 일반적으로 이 방법은 게으른 프로그래머에게만 작동합니다. 물론 가장 좋은 방법은 프로그램이 기본 클래스 코드를 건드리지 못하게 하고 인터페이스만 제공하는 것입니다.
PHP에서는 오버로딩이 지원되지 않습니다. 객체 지향 프로그래밍에서는 서로 다른 매개 변수 유형과 숫자를 정의하여 동일한 이름으로 멤버 함수를 오버로드할 수 있습니다. PHP는 느슨한 유형의 언어이므로 매개변수 유형 오버로드는 쓸모가 없습니다. 마찬가지로, 다양한 수의 매개변수를 사용한 오버로드는 작동하지 않습니다.
때로는 객체 지향 프로그래밍에서 생성자를 오버로드하여 다양한 방식으로(다른 수의 인수 전달을 통해) 다양한 객체를 생성할 수 있도록 하는 것이 유용합니다. 약간의 트릭을 사용하면 이 작업을 수행할 수 있습니다.
class Myclass {
function Myclass() {
$name="Myclass".func_num_args()
$this- > $name();
//$this->$name()은 일반적으로 잘못되었지만 여기서는
//$name이 호출할 메서드 이름이 포함된 문자열입니다. } 함수. MyClass1 ($ x) {
코드;
}
함수 MyClass2 ($ x, $ y) {
코드
}

이 방법을 통해 오버로딩 목적을 부분적으로 달성할 수 있습니다.
$obj1=new Myclass(1); //Myclass1을 호출합니다.
$obj2=new Myclass(1,2); //Myclass2를 호출합니다.
느낌이 꽤 좋습니다!
다형성
다형성은 런타임 시 객체가 매개변수로 전달될 때 호출할 메서드를 결정하는 객체의 능력으로 정의됩니다. 예를 들어 클래스를 사용하여 "draw" 메서드를 정의하고 클래스를 상속하여 원이나 사각형을 그리는 "draw" 동작을 재정의하여 x 매개변수를 갖는 함수를 갖게 됩니다. $x->draw( )를 호출합니다. 다형성이 지원되면 "draw" 메서드에 대한 호출은 객체 x 유형에 따라 달라집니다. 다형성은 PHP에서 자연스럽게 지원됩니다(C 컴파일러에서 이 상황을 생각해 보십시오. 컴파일되면 어떤 메소드가 호출됩니까? 그러나 객체의 유형이 무엇인지 알 수 없습니다. 물론 지금은 그렇지 않습니다). 다행스럽게도 PHP는 다형성을 지원합니다.
function nice드로잉($x) {
//Board 클래스의 메서드라고 가정합니다.
$x->draw()
}
$obj=new Circle(3,187);
$obj2=new Rectangle(4,5);
$board->nice드로잉($obj); //Circle의 그리기 메서드를 호출합니다. >$board->nice드로잉($obj2); //Rectangle의 draw 메소드를 호출합니다.
?>
PHP의 객체 지향 프로그래밍
순수 객체 이론가들은 PHP가 진정한 객체 지향이 아니라고 믿습니다. 지향언어 맞습니다. PHP는 객체 지향 또는 전통적인 구조적 프로그래밍 방법과 함께 사용할 수 있는 하이브리드 언어입니다. 그러나 대규모 프로젝트의 경우 클래스를 정의하는 데 순수한 객체 지향 접근 방식을 사용하고 프로젝트에서 객체와 클래스만 사용할 수도 있고 필요할 수도 있습니다. 규모가 점점 커지는 프로젝트에서는 객체 지향 접근 방식을 사용하면 이점을 얻을 수 있습니다. 객체 지향 프로젝트는 유지 관리, 이해 및 재사용이 더 쉽습니다. 이것이 소프트웨어 공학의 기초이다. 웹사이트 디자인에 이러한 개념을 사용하는 것이 미래 성공의 열쇠입니다.
PHP의 고급 객체지향 기술
객체지향의 기본 개념을 살펴본 후 좀 더 고급 기술을 소개하겠습니다.
직렬화
PHP는 영구 객체를 지원하지 않습니다. 객체 지향 언어에서 영구 객체는 애플리케이션에서 여러 번 호출한 후에도 상태와 기능을 유지하는 객체입니다. 파일이나 데이터베이스에 저장한 다음 개체를 다시 로드합니다. 이 메커니즘을 직렬화라고 합니다. PHP에는 객체에 대해 호출할 수 있는 직렬화 함수가 있습니다. 직렬화 함수는 객체를 나타내는 문자열을 반환합니다. 그런 다음 직렬화 함수는 멤버 함수 대신 멤버 데이터를 저장합니다.
PHP4에서는 객체를 문자열 $s로 직렬화한 다음 객체를 삭제하고 객체를 $obj로 역직렬화해도 여전히 객체의 메서드 함수를 호출할 수 있습니다. 그러나 (a) 이 기능은 향후 지원되지 않을 수 있고 (b) 직렬화된 개체를 디스크에 저장하고 프로그램을 종료하면 팬텀이 발생하기 때문에 이 접근 방식을 권장하지 않습니다. 직렬화된 문자열은 멤버 함수를 나타내지 않기 때문에 이 개체를 역직렬화할 수 없으며 나중에 이 스크립트를 다시 실행할 때 개체의 메서드가 여전히 유효할 것으로 기대할 수 없습니다. 마지막으로, 저장된 객체의 멤버 변수를 직렬화하는 것은 PHP에서 매우 유용합니다. (연관 배열과 배열을 디스크로 직렬화할 수 있습니다.)
예:
$obj=new Classfoo()
$str=serialize($obj)
// $str을 디스크에 저장
// ...몇 달 후
//디스크에서 str 로드
$obj2=unserialize($str)
?> 위의 예에서는 멤버 함수 없이 멤버 변수를 복원할 수 있습니다(다음에 따라). 문서화). 이로 인해 $obj2->x가
멤버 변수에 액세스하는 유일한 방법이 됩니다(멤버 함수가 없기 때문입니다).
아직 이 문제를 해결할 수 있는 방법이 몇 가지 있지만, 이 깨끗한 문서를 엉망으로 만들 수 있기 때문에 여러분에게 맡깁니다.
앞으로 PHP에서 직렬화를 완벽하게 지원했으면 좋겠습니다.
클래스를 사용하여 저장된 데이터 조작
PHP와 객체 지향 프로그래밍의 좋은 점 중 하나는 무언가를 조작하기 위해 클래스를 쉽게 정의하고 필요할 때 적절한 클래스를 호출할 수 있다는 것입니다. HTML 파일이 있고 제품 ​​ID 번호를 선택하여 제품을 선택해야 한다고 가정합니다. 귀하의 데이터는 데이터베이스에 저장되어 있으며 가격 등의 제품 정보를 표시하려고 합니다. 다양한 종류의 제품이 있으며 동일한 작업도 제품마다 다른 의미를 갖습니다. 예를 들어, 소리를 표시한다는 것은 소리를 재생하는 것을 의미하지만 다른 제품의 경우 데이터베이스에 저장된 이미지를 표시할 수도 있습니다. 객체 지향 프로그래밍과 PHP를 사용하면 더 적은 코드로 더 나은 성능을 발휘할 수 있습니다.
클래스를 정의하고, 클래스가 가져야 할 메소드를 정의한 후 상속을 통해 각 제품 클래스(SoundItem 클래스, ViewableItem 클래스 등)를 정의하고, 각 제품 클래스의 메소드를 원하는 대로 재정의합니다. 필요.데이터베이스에 저장하는 테이블의 제품 유형 필드를 기반으로 각 제품 유형에 대한 클래스를 정의합니다. 일반적인 제품 테이블에는 필드(ID, 유형, 가격, 설명 등)가 있습니다. 스크립트에서는 데이터베이스 테이블에서 유형 정보를 가져온 다음 해당 클래스의 객체를 인스턴스화합니다.
$obj=new $type()
$obj-> action( );
?>
이는 객체의 유형에 관계없이 표시 메소드 또는 $obj의 다른 메소드를 호출할 수 있는 기능입니다. 이 기술을 사용하면 새 유형의 개체를 추가할 때 스크립트를 수정할 필요가 없습니다. 이 방법은 약간 강력합니다. 모든 개체가 유형에 관계없이 가져야 하는 메서드를 정의한 다음 이를 다른 클래스에서 다른 방식으로 구현하여 스크립트에서 다른 유형의 개체에 사용할 수 있도록 하는 것입니다. , 두 명의 프로그래머가 같은 파일에 만족할 수는 없습니다. 프로그래밍이 그렇게 즐거운 일이라고 생각하시나요? 유지 관리가 적고 재사용이 가능합니까?
프로그래머 그룹을 이끄는 경우 가장 좋은 방법은 각 사람이 특정 클래스와 개체를 담당할 수 있도록 작업을 나누는 것입니다. 국제화는 동일한 기술을 사용하여 해결될 수 있으며, 사용자가 선택한 다양한 언어에 적합한 클래스를 만드는 등의 작업을 수행할 수 있습니다.
복사 및 복제
$obj 개체를 생성할 때 $obj2 = $obj를 사용하여 개체를 복사할 수 있습니다. 새 개체는 $obj의 복사본(참조가 아님)이므로 새 개체를 할당한 후 object 새로운 상태의 $obj가 있습니다. 때로는 이것을 원하지 않고 obj와 동일한 새 객체를 만들고 마치 new 명령을 사용한 것처럼 새 객체의 생성자를 호출하기를 원할 수도 있습니다. 이는 PHP의 직렬화와 다른 클래스가 상속해야 하는 기본 클래스를 사용하여 달성할 수 있습니다.
위험 영역 진입
객체를 직렬화하면 특정 형식의 문자열을 얻게 됩니다. 궁금하다면 문자열에 있는 비밀을 탐색해 볼 수 있습니다. :
$herring = serialize($obj);
$vec =explore(":",$herring)
$nam = str_replace(""", "" , $vec[2]);
?>
"Universe" 클래스를 생성하고 모든 클래스가 "Universe"에서 상속되도록 한다고 가정하면 " Universe"는 복제 메서드를 정의할 수 있습니다.
< ?php
class Universe {
function __clone() {
$herring=serialize($this)
$vec=explode(" :",$herring); str_replace(""", "",$vec[2]);
$ret= new $nam;
return $ret;
}
}
//다음:
$obj=new Something();
//우주를 확장하는 것 !!
$other=$obj->__clone()
?> of class new 를 사용하는 것과 같으며 생성자가 호출됩니다. 이것이 당신에게 효과가 있을지는 모르겠지만 Universe 클래스가 상속받은 클래스의 이름을 알고 있는 것은 좋은 습관입니다. 당신의 유일한 한계는 당신의 상상력입니다! ! !
참고: 저는 PHP4를 사용하고 있으며, 기사의 일부 내용은 PHP3에 적합하지 않을 수 있습니다.
-끝-

위 내용은 객체지향 PHP에서의 객체지향 프로그래밍을 소개합니다. 객체지향 측면을 포함한 대규모 PHP 프로젝트에 대한 접근 방식이 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.