>  기사  >  백엔드 개발  >  PHP의 객체지향

PHP의 객체지향

WBOY
WBOY원래의
2016-07-30 13:30:021070검색

액세스 제어(가시성)

PHP의 액세스 제어에는 공개(public), 보호(protected) 및 비공개(private)가 포함됩니다.

공개로 정의된 클래스 멤버는 어디서나 액세스할 수 있습니다. .
protected로 정의된 클래스 멤버는 자체, 하위 클래스 및 상위 클래스에서 액세스할 수 있습니다.
private으로 정의된 클래스 멤버는 해당 멤버가 정의된 클래스에서만 액세스할 수 있습니다.

을 수정하는 데 사용할 수 없습니다. class

클래스 속성은 생략할 수 없으며 public, protected, private 중 하나로 정의해야 합니다.

클래스의 메소드에 이러한 키워드가 설정되지 않은 경우 해당 메소드는 기본적으로 공개됩니다.

동일한 클래스의 개체는 동일한 인스턴스가 아니더라도 서로의 private 및 protected 멤버에 액세스할 수 있습니다. 이는 이러한 개체의 내부 구현 세부 정보가 알려져 있기 때문입니다.


속성

->(객체 연산자) 사용: $this->property(여기서 property는 속성의 이름입니다). -정적 속성. 정적 속성은 ::(이중 콜론)을 사용하여 액세스됩니다. self::$property

$this는 호출 개체에 대한 참조입니다.


클래스 상수

은 클래스 내에서 항상 변하지 않는 값을 상수로 정의할 수 있습니다. 상수를 정의하고 사용할 때 $ 기호를 사용할 필요는 없습니다.

상수의 값은 변수, 클래스 속성, 수학 연산 또는 함수 호출의 결과가 아닌 고정된 값이어야 합니다

이중 콜론 사용 ::Access

<code>const constant = 'constant value';
</code>

클래스 자동 로딩

많은 개발자는 객체 지향 애플리케이션을 작성할 때 각 클래스 정의에 대해 PHP 소스 파일을 만듭니다. 각 스크립트의 시작 부분에 포함 파일의 긴 목록(클래스당 하나의 파일)을 작성해야 한다는 점은 큰 성가신 일입니다.

PHP 5에서는 더 이상 필요하지 않습니다. 아직 정의되지 않은 클래스를 사용하려고 할 때 자동으로 호출되는 spl_autoload_register() 함수를 정의할 수 있습니다. 이 함수를 호출하면 스크립팅 엔진은 PHP가 오류로 인해 실패하기 전에 필요한 클래스를 로드할 수 있는 마지막 기회를 갖게 됩니다.

<code><?php

// function __autoload($class) {
//     include 'classes/' . $class . '.class.php';
// }

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

// 或者,自 PHP 5.3.0 起可以使用一个匿名函数
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

?>
</code>

생성자 및 소멸자

생성자 및 소멸자는 엔진에서 암시적으로 호출되지 않습니다. 상위 클래스의 생성자와 소멸자를 실행하려면 자동 로딩이 아닌 이상 하위 클래스의 생성자 본문과 소멸자 본문에서 parent::__construct(); parent::__destruct()


inherited

키워드 extends


범위 결정 연산자(::)

범위 결정 연산자( Paamayim Nekudotayim 이라고도 함) 이상을 사용하여 상속 단순히 정적 멤버, 클래스 상수에 액세스하는 데 사용할 수 있는 콜론 쌍


정적(정적) 키워드

는 클래스 특성이나 메서드를 정적으로 선언합니다. 클래스를 인스턴스화하지 않고 직접 액세스합니다. 정적 속성은 인스턴스화된 클래스의 개체를 통해 액세스할 수 없습니다(그러나 정적 메서드는 가능함).

정적 속성과 메서드는 기본적으로 공개입니다.


추상 클래스

클래스에 최소한 다음이 포함된 경우 키워드를 사용하세요

abstract

메소드가 추상으로 선언되면 클래스도 추상으로 선언되어야 합니다.

추상으로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다.


인터페이스

인터페이스는 인터페이스 키워드를 통해 정의됩니다.

인터페이스에 정의된 모든 메소드는 인터페이스의 특성인 public이어야 합니다.

인터페이스에서 상수를 정의할 수도 있습니다. 인터페이스 상수와 클래스 상수의 사용은 완전히 동일하지만 서브클래스나 서브인터페이스로 재정의할 수 없습니다.

인터페이스를 구현하려면 Implements 연산자를 사용하세요. 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 치명적인 오류가 보고됩니다. 클래스는 여러 인터페이스를 구현할 수 있습니다. 쉼표를 사용하여 여러 인터페이스의 이름을 구분하세요.

인터페이스는 인터페이스에서 상속할 수도 있습니다.


특성

PHP 5.4.0부터 PHP는 특성이라는 코드 재사용 방법을 구현합니다.

<code><?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
</code>
use 문의 여러 특성을 쉼표로 구분하여 나열

<code><?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}
?>
</code>

마법 메서드

__construct()

__destruct()
__call()
__callStatic()
__get()
__세트()
__isset()
__unset()
__sleep() serialize() 함수는 클래스에 매직 메서드 __sleep()이 존재하는지 확인합니다. 존재하는 경우 이 메서드가 먼저 호출된 다음 직렬화 작업이 수행됩니다.
__wakeup() unserialize()는 __wakeup() 메서드가 있는지 확인합니다. 존재하는 경우 __wakeup 메소드가 먼저 호출됩니다
__toString()은 클래스가 문자열로 처리될 때 클래스가 어떻게 응답해야 하는지 설명하는 데 사용됩니다.
__invoke() 함수를 호출하여 객체를 호출하려고 하면 __invoke() 메서드가 자동으로 호출됩니다.
__set_state() 이 정적 메서드는 클래스를 내보내기 위해 var_export()가 호출될 때 호출됩니다.
__clone()
__debugInfo() var_dump()는 객체가 사용될 때 호출됩니다.

이러한 함수를 PHP에서는 "매직 메소드"라고 합니다. 마법 기능을 사용하려는 경우가 아니면 자체 클래스 메서드 이름을 지정할 때 이러한 메서드 이름을 사용할 수 없습니다.

액세스할 수 없는 속성에 값을 할당하면 __set()가 호출됩니다.

액세스할 수 없는 속성의 값을 읽을 때 __get()이 호출됩니다.

__isset()은 액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출될 때 호출됩니다.

액세스할 수 없는 속성에 대해 unset()이 호출되면 __unset()이 호출됩니다.

객체에서 액세스할 수 없는 메서드가 호출되면 __call()이 호출됩니다.

정적 모드에서 액세스할 수 없는 메서드를 호출하면 __callStatic()이 호출됩니다.


최종 키워드

부모 클래스의 메서드가 final로 선언되면 하위 클래스가 해당 메서드를 재정의할 수 없습니다. 클래스가 final로 선언되면 상속될 수 없습니다.

속성은 final로 정의할 수 없으며 클래스와 메소드만 final로 정의할 수 있습니다


객체 복사

clone 키워드를 통해 객체 복사가 가능합니다(만약 아마도 이는 객체의 __clone() 메서드를 호출할 것입니다. 객체의 __clone() 메서드는 직접 호출할 수 없습니다.


객체 비교

비교 연산자(==)를 사용하여 두 객체 변수를 비교할 때 비교 원칙은 두 객체의 속성과 속성값이 일치하는 경우입니다. 동일하며 두 개체가 동일한 클래스의 인스턴스인 경우 두 개체 변수는 동일합니다.

항등 연산자(===)를 사용하는 경우 이 두 객체 변수는 특정 클래스의 동일한 인스턴스(즉, 동일한 객체)를 가리켜야 합니다.


유형 제약 조건

PHP 5에서는 유형 제약 조건을 사용할 수 있습니다. 함수 매개변수는 객체(함수 프로토타입에 클래스 이름 지정), 인터페이스, 배열(PHP 5.1부터) 또는 호출 가능(PHP 5.4부터)으로 지정할 수 있습니다. 그러나 매개변수의 기본값으로 NULL을 사용하는 경우에도 함수 호출 시 실제 매개변수로 NULL을 사용할 수 있습니다.

int 또는 string과 같은 스칼라 유형에는 유형 제약 조건을 사용할 수 없습니다. 특성도 허용되지 않습니다.

타입 제약은 클래스 멤버 함수뿐만 아니라 함수에서도 사용됩니다.


객체 직렬화

PHP의 모든 값을 사용할 수 있습니다. 직렬화 함수 ()는 표현할 바이트 스트림을 포함하는 문자열을 반환합니다. unserialize() 함수는 문자열을 PHP의 원래 값으로 다시 변경할 수 있습니다. 객체를 직렬화하면 객체의 모든 변수가 저장되지만 객체의 메소드는 저장되지 않습니다.


저작권: 이 글은 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.

위 내용은 PHP의 객체지향을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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