1. 소개
PHP 5 이후로 객체 모델은 더 나은 성능과 더 많은 기능을 제공하기 위해 완전히 다시 작성되었습니다. 이는 PHP 4 이후 가장 큰 변화입니다. PHP 5에는 완전한 개체 모델이 있습니다.
PHP 5의 새로운 기능에는 액세스 제어, 추상 및 최종 클래스와 메소드, 추가 매직 메소드, 인터페이스, 객체 복사 및 유형 제약이 포함됩니다.
PHP는 객체를 참조 및 핸들과 동일한 방식으로 처리합니다. 즉, 각 변수는 전체 객체의 복사본이 아닌 객체에 대한 참조를 보유합니다.
2. 기본 개념
1.class
각 클래스의 정의는 class 키워드로 시작하고 그 뒤에 클래스 이름, 중괄호 한 쌍, 내부 클래스 속성과 메소드의 정의를 포함합니다.
클래스 이름은 PHP 예약어가 아닌 모든 유효한 태그일 수 있습니다. 법적 클래스 이름은 문자 또는 밑줄로 시작하고 그 뒤에 여러 문자, 숫자 또는 밑줄이 옵니다. 정규식으로 표현: [a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*.
클래스에는 자체 상수, 변수("속성"이라고 함) 및 함수("메서드"라고 함)가 포함될 수 있습니다.
예제 #1 간단한 클래스 정의
<?php class SimpleClass { //声明属性 public $var = '1'; //声明方法 public function displayVar(){ echo $this->var; } } ?>
클래스 정의 내에서 메서드가 호출되면 의사 변수 $this를 사용할 수 있습니다. $this는 호출 개체에 대한 참조입니다(일반적으로 메서드가 속한 개체이지만 두 번째 개체에서 정적으로 호출되는 경우 다른 개체일 수도 있음).
예제 #2 $this 의사 변수의 예
<?php class A { function foo() { if(isset($this)){ echo '$this is defined ('; echo get_class($this); echo ')<br>'; }else{ echo '$this is not defined.<br>'; } } } class B { function bar() { //如果开启了E_STRICT这一行会有警告提示 A::foo(); } } $a = new A(); $a -> foo(); //如果开启了E_STRICT这一行会有警告提示 A::foo(); $b = new B(); $b -> bar(); //如果开启了E_STRICT这一行会有警告提示 B::bar(); ?>
출력 결과:
$this가 정의됨(A)
$this가 정의되지 않았습니다.
$ 이것은 정의됨(B)
$this는 정의되지 않습니다.
2.new
클래스의 인스턴스를 생성하려면 new 키워드를 사용해야 합니다. 객체가 생성자를 정의하고 오류 시 예외가 발생하지 않는 한 새 객체는 생성될 때 항상 값이 할당됩니다. 클래스는 인스턴스화되기 전에 정의되어야 합니다(어떤 경우에는 이것이 필요합니다).
new 뒤에 클래스 이름이 포함된 문자열이 오면 클래스의 인스턴스가 생성됩니다. 클래스가 네임스페이스에 속하는 경우 전체 이름을 사용해야 합니다.
예제 #3 인스턴스 생성
<?php $instance = new SimpleClass(); //也可以这样做: $className = "Foo"; $instance = new $className(); //Foo() ?>
클래스 정의 내에서 new self와 new parent를 사용하여 새 객체를 생성할 수 있습니다.
이미 생성된 개체의 인스턴스를 새 변수에 할당하면 새 변수는 개체에 할당된 것과 동일한 인스턴스에 액세스합니다. 이 동작은 인스턴스를 함수에 전달할 때와 동일합니다. 복제를 사용하여 이미 생성된 개체의 새 인스턴스를 생성할 수 있습니다.
예제 #4 개체 할당
include_once('class1.php'); $instance = new SimpleClass(); $assigned = $instance; $reference = & $instance; $instance -> var = '$assigned will have this value'; $instance = null; //$instance和$reference变成null var_dump($instance); var_dump($reference); var_dump($assigned);
출력 결과는 다음과 같습니다.
NULL
NULL
object(SimpleClass)#1 (1) { ["var" ] => string(30) "$designed는 이 값을 갖습니다." }
PHP 5.3.0에는 객체의 인스턴스를 생성하는 두 가지 새로운 방법이 도입되었습니다:
c
lass Test { static public function getNew() { return new static; } } class Child extends Test {} $obj1 = new Test(); $obj2 = new $obj1; var_dump($obj1 !== $obj2); $obj3 = Test::getNew(); var_dump($obj3 instanceof Test); $obj4 = Child::getNew(); var_dump($obj4 instanceof Child);
출력 결과:
bool(true)
bool(true)
bool(true)
3.extends
클래스는 선언의 확장 키워드를 사용하여 다른 클래스의 메서드와 속성을 상속받을 수 있습니다. PHP는 다중 상속을 지원하지 않습니다. 클래스는 하나의 기본 클래스(Java와 같은 단일 상속)만 상속할 수 있습니다.
상속된 메서드와 속성은 동일한 이름으로 다시 선언하여 재정의할 수 있습니다. 그러나 상위 클래스가 메서드를 정의할 때 final을 사용하면 해당 메서드를 재정의할 수 없습니다. 재정의된 메서드나 속성은 parent:: 를 통해 액세스할 수 있습니다.
메서드를 재정의할 때 매개변수는 일관성이 있어야 합니다. 그렇지 않으면 PHP는 E_STRICT 수준 오류 메시지를 표시합니다. 단, 생성자는 재정의될 때 다른 매개변수를 사용할 수 있습니다.
예제 #6 단순 클래스 상속:
class ExtendClass extends SimpleClass { //重写父类的方法 function displayVar() { echo "Extending class<br>"; parent::displayVar(); } } $extended = new ExtendClass(); $extended -> displayVar();
출력 결과:
확장 클래스
1
4.::class
PHP 5.5부터는 class 키워드를 클래스 이름 구문 분석에도 사용할 수 있습니다. ClassName::class를 사용하면 ClassName 클래스의 정규화된 이름이 포함된 문자열을 얻을 수 있습니다. 이는 네임스페이스를 사용하는 클래스에 특히 유용합니다.
예제 #7 클래스 이름 구문 분석
namespace NS{ class ClassName{} echo ClassName::class; }
출력 결과:
NSClassName