> 백엔드 개발 > PHP 튜토리얼 > PHP 클래스와 객체

PHP 클래스와 객체

伊谢尔伦
풀어 주다: 2016-11-23 14:24:44
원래의
1539명이 탐색했습니다.

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 = &#39;1&#39;;
        //声明方法
        public function displayVar(){
            echo $this->var;
        }
    }
?>
로그인 후 복사

클래스 정의 내에서 메서드가 호출되면 의사 변수 $this를 사용할 수 있습니다. $this는 호출 개체에 대한 참조입니다(일반적으로 메서드가 속한 개체이지만 두 번째 개체에서 정적으로 호출되는 경우 다른 개체일 수도 있음).
예제 #2 $this 의사 변수의 예

<?php
    class A
    {
        function foo()
        {
            if(isset($this)){
                echo &#39;$this is defined (&#39;;
                echo get_class($this);
                echo &#39;)<br>&#39;;
            }else{
                echo &#39;$this is not defined.<br>&#39;;
            }
        }
    }
    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(&#39;class1.php&#39;);
$instance = new SimpleClass();
$assigned = $instance;
$reference = & $instance;
$instance -> var = &#39;$assigned will have this value&#39;;
$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


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿