PHP5의 객체는 보다 체계적이고 포괄적으로 조정되었으며 현재 모양은 Java와 다소 유사해 보일 수 있습니다. 이 섹션에서는 PHP5의 새로운 객체 모드에 중점을 두고 설명할 수 있는 몇 가지 간단한 예제를 제공합니다. 이 섹션을 PHP5 여정의 새로운 출발점이 되도록 하세요. :)
* 생성자와 소멸자
* 객체 참조
*오브젝트의 클론
* 개체의 개인, 공개 및 보호 모드
* 인터페이스
* 추상 클래스
* __부르다
* __set 및 __get
* 정적 멤버
생성자와 소멸자
PHP4에서는 함수의 이름이 객체와 같을 때 이 함수가 객체의 생성자가 되며, PHP4에는 소멸자 개념이 없습니다.
PHP5에서는 생성자의 이름을 __construct로 통일하고, 소멸자 개념을 도입하여 __destruct로 통일합니다.
예제 1: 생성자 및 소멸자
클래스 foo {
var $x;
함수 __construct($x) {
$this->x = $x;
}
함수 표시() {
print($this->x);
}
함수 __destruct() {
print("안녕하세요");
}
}
$o1 = 새로운 foo(4);
$o1->디스플레이();
?>
위의 예에서 foo 클래스에 대한 호출을 종료하면 해당 소멸자가 호출되고 위 예에서는 "bye bye"가 출력됩니다.
객체 참조는
PHP4에서 함수나 메소드에 변수를 전달하면 실제로 변수의 복사본이 만들어집니다. 즉, 참조를 사용하지 않는 한 함수나 메소드에 전달하는 내용은 변수의 복사본입니다. . "&" 기호는 복사가 아닌 참조가 작성됨을 선언하는 데 사용됩니다. PHP5에서는 객체는 항상 참조의 형태로 존재하며, 객체에 대한 할당 연산도 참조 연산입니다.
예시 2: 객체 참조
클래스 foo {
var $x;
함수 setX($x) {
$this->x = $x;
}
함수 getX() {
$this->x를 반환합니다;
}
}
$o1 = 새로운 foo;
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("맙소사!");
?>
Clone of Object
위에서 언급한 것처럼, 객체가 항상 참조 형태로 호출될 때, 그 객체의 복사본을 얻고 싶다면 어떻게 해야 할까요? PHP5는 객체 복제라는 새로운 기능을 제공하며 구문은 __clone입니다.
예 3: 객체 복제
클래스 foo {
var $x;
함수 setX($x) {
$this->x = $x;
}
함수 getX() {
$this->x를 반환합니다;
}
}
$o1 = 새로운 foo;
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5); if($o1->getX() != $o2->getX()) print("복사본은 독립적입니다.");
?>
객체 복제 방법은 다른 많은 응용 프로그램 언어에도 존재하므로 안정성에 대해 걱정할 필요가 없습니다. :)
객체의 비공개, 공개 및 보호 모드
PHP4에서는 객체의 모든 메소드와 변수가 공개됩니다. 즉, 객체 외부의 모든 변수와 메소드를 작동할 수 있다는 의미입니다. PHP5에는 이 액세스 권한을 제어하기 위한 세 가지 새로운 모드인 공개, 보호 및 비공개가 도입되었습니다.
퍼블릭 모드(Public): 객체 외부에서 동작 제어를 허용합니다.
프라이빗 모드(Private): 이 개체 내의 메서드만 이를 작동하고 제어할 수 있습니다.
보호 모드(Protected): 이 개체와 해당 상위 개체가 이를 작동하고 제어할 수 있도록 허용합니다.
예제 4: 객체의 개인용, 공용 및 보호 모드
클래스 foo {
비공개 $x;
공개 함수 public_foo() {
print("저는 공개입니다.");
}
보호 함수 protected_foo() {
$this->private_foo(); //같은 클래스에 있기 때문에 비공개 메소드를 호출할 수 있습니다.
print("나는 보호받고 있습니다.");
}
개인 함수 private_foo() {
$this->x = 3;
print("저는 비공개입니다.");
}
}
클래스 foo2는 foo {를 확장합니다.
공개 함수 디스플레이() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // 기본 클래스에서 비공개 함수입니다.
}
} $x = 새로운 foo();
$x->public_foo();
//$x->protected_foo(); //Invalid는 클래스 및 파생 클래스 외부에서 보호된 메서드를 호출할 수 없습니다.
//$x->private_foo(); //잘못된 비공개 메서드는 클래스 내에서만 사용할 수 있습니다. $x2 = new foo2();
$x2->디스플레이();
?>
팁: 객체의 변수는 항상 비공개 형식으로 존재합니다. 객체에서 변수를 직접 조작하는 것은 좋은 객체 지향 프로그래밍 습관이 아닙니다. 처리를 위해 원하는 변수를 객체의 메서드에 넘겨주는 것입니다.
인터페이스
우리 모두 알고 있듯이, PHP4의 객체는 상속을 지원합니다. 객체를 다른 객체의 파생 클래스로 만들려면 "클래스 foo 확장 상위"와 유사한 코드를 사용하여 이를 제어해야 합니다. PHP4 및 PHP5에서는 객체를 한 번만 상속할 수 있으며 다중 상속은 지원되지 않습니다. 그러나 PHP5에서는 인터페이스라는 새로운 용어가 탄생했습니다. 인터페이스는 특정 처리 코드가 없는 특수 개체이며 일부 메서드의 이름과 매개 변수만 정의하면 'implement' 키워드를 사용하여 개체를 편리하게 사용할 수 있습니다. 필요한 인터페이스가 통합된 후 특정 실행 코드가 추가됩니다.
예시 5: 인터페이스
인터페이스 표시 가능 {
함수 표시();
}
인터페이스 인쇄 가능 {
함수 doprint();
}
클래스 foo는 디스플레이 가능, 인쇄 가능 {을 구현합니다.
함수 표시() {
// 코드
} 함수 doprint() {
// 코드
}
}
?>
이는 코드의 가독성과 인기도를 높이는 데 매우 도움이 됩니다. 위의 예에서 foo 객체에는 디스플레이 가능 및 인쇄 가능이라는 두 가지 인터페이스가 포함되어 있음을 알 수 있습니다. 이때 foo 객체에는 디스플레이가 있어야 함을 분명히 알 수 있습니다. () 메소드와 print() 메소드를 사용하면 인터페이스 부분만 이해하면 객체가 내부적으로 어떻게 작동하는지 신경 쓸 필요 없이 쉽게 객체를 조작할 수 있습니다.
추상 클래스
추상 클래스는 인스턴스화할 수 없습니다.
다른 클래스와 마찬가지로 추상 클래스를 사용하면 변수와 메서드를 정의할 수 있습니다.
추상 클래스는 추상 메서드를 정의할 수도 있습니다. 추상 클래스의 메서드는 실행되지 않지만 파생 클래스에서 실행될 수 있습니다.
예제 6: 추상 클래스
추상 클래스 foo {
보호된 $x;
추상함수 display();
함수 setX($x) {
$this->x = $x;
}
}
클래스 foo2는 foo {를 확장합니다.
함수 표시() {
// 코드
}
}
?>
__call
PHP5 객체에는 객체의 다른 메소드를 모니터링하는 데 사용되는 새로운 전용 메소드 __call()이 있습니다. 객체에 존재하지 않는 메서드를 호출하려고 하면 __call 메서드가 자동으로 호출됩니다.
예시 7: __call
클래스 foo {
함수 __call($name,$arguments) {
print("나한테 전화하셨나요? 저는 $name이에요!");
}
} $x = 새로운 foo();
$x->doStuff();
$x->fancy_stuff();
?>
이 특별한 메소드는 "오버로딩" 작업을 구현하는 데 사용될 수 있으므로 매개변수를 확인하고 개인 메소드를 호출하여 매개변수를 전달할 수 있습니다.
예제 8: __call을 사용하여 "오버로드" 작업 구현
클래스 매직 {
함수 __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} 비공개 함수 foo_for_int($x) {
print("오 정수입니다!");
} 비공개 함수 foo_for_string($x) {
print("아 문자열이군요!");
}
} $x = 새로운 매직();
$x->foo(3);
$x->foo("3");
?>
__set 및 __get
이것은 훌륭한 메서드입니다. __set 및 __get 메서드는 개체에 존재하지 않는 변수와 메서드를 캡처하는 데 사용할 수 있습니다.
예제 9: __set 및 __get
클래스 foo {
함수 __set($name,$val) {
print("안녕하세요, $name에 $val을 넣으려고 했습니다.");
}
함수 __get($name) {
print("안녕하세요 $name을 요청하셨습니다");
}
}
$x = 새로운 foo();
$x->바 = 3;
print($x->winky_winky);
?>
유형 표시
PHP5에서는 매개변수가 다른 객체의 인스턴스여야 함을 객체의 메서드에 지정할 수 있습니다.
예 10: 유형 표시
클래스 foo {
// 코드 ...
}
클래스 바 {
공개 함수 process_a_foo(foo $foo) {
//일부 코드
}
}
$b = 새로운 바();
$f = 새로운 foo();
$b->process_a_foo($f);
?>
보시다시피, 매개변수 앞에 객체의 이름을 명시적으로 지정할 수 있으며, PHP5는 매개변수가 객체 인스턴스가 될 것임을 인식합니다.
정적 멤버
정적 멤버와 정적 메서드를 객체지향 프로그래밍 용어로 "객체 메서드(클래스 메서드)", "객체 변수(클래스 변수)"라고 합니다.
객체가 인스턴스화되기 전에 "객체 메서드"를 호출할 수 있습니다. 마찬가지로, "객체 변수"는 객체가 인스턴스화되기 전에 독립적으로 제어할 수 있습니다(객체를 제어하기 위해 객체의 메서드를 사용하지 않고).
예제 11: 객체 메서드 및 객체 변수
클래스 계산기 {
정적 공개 $pi = 3.14151692;
정적 공개 함수 add($x,$y) {
$x + $y를 반환합니다.
}
}
$s = 계산기::$pi;
$result = 계산기::추가(3,7);
print("$result");
?>
예외 처리
예외 처리는 프로그램 오류를 처리하기 위한 이상적인 방법으로 인식됩니다. 이 개념은 Java 및 C++에서 사용할 수 있습니다. 이 응용 프로그램이 PHP5에 추가된 것을 기쁘게 생각합니다. "try"와 "catch"를 사용하여 프로그램 오류를 제어할 수 있습니다.
예제 12: 예외 처리
클래스 foo {
함수 나누기($x,$y) {
if($y==0) throw new Exception("0으로 나눌 수 없습니다.");
$x/$y를 반환합니다.
}
}
$x = 새로운 foo();
노력하다 {
$x->나누기(3,0);
} 잡기(예외 $e) {
echo $e->getMessage();
에코 "n
N";
// 여기에는 몇 가지 치명적인 조치가 있습니다.
}
?>
위의 예에서는 중괄호 안의 명령문을 실행하기 위해 "try"를 사용했습니다. 오류가 발생하면 코드는 처리를 위해 오류를 "catch" 절에 넘겨줍니다. 객체에 대한 오류를 처리하면 코드 구조가 더 명확해 보일 수 있습니다. 이제 처리를 위해 모든 오류 정보를 객체에 전달할 수 있기 때문입니다.
사용자 정의 오류 처리
사용자 정의 오류 처리 코드를 사용하여 프로그램의 사고를 쉽게 제어할 수 있습니다. 예외 클래스에서 자체 오류 제어 클래스를 파생시키기만 하면 됩니다. 자체 오류 제어 클래스에는 생성자와 getMessage 메서드가 있어야 합니다.
예시 13: 사용자 정의 오류 처리
WeirdProblem 클래스는 예외 {를 확장합니다.
비공개 $data;
함수 WeirdProblem($data) {
부모::예외();
$this->data = $data;
}
함수 getMessage() {
return $this->data . " 이상한 예외가 발생했습니다!";
}
}
?>
이제 "throw new WeirdProblem($foo)"을 사용하여 오류 핸들러를 던질 수 있습니다. "try" 코드 블록에서 오류가 발생하면 PHP5는 처리를 위해 자동으로 오류를 "catch" 부분에 전달합니다.
네임스페이스
네임스페이스는 클래스 그룹화 또는 함수 그룹화에 유용합니다. 나중에 쉽게 호출할 수 있도록 일부 관련 클래스나 함수를 그룹화할 수 있습니다.
예시 14: 네임스페이스
네임스페이스 수학 {
클래스 복합 {
//...암호...
함수 __construct() {
print("안녕");
}
}
} $m = new Math::Complex();
?>
네임스페이스를 사용해야 하는 상황에 주의하세요. 실제 애플리케이션에서는 서로 다른 작업을 수행하기 위해 동일한 이름을 가진 두 개 이상의 개체를 선언해야 할 수 있습니다. 그런 다음 이를 다른 네임스페이스에 배치할 수 있습니다. 동일).