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

PHP 객체지향의 본질

WBOY
WBOY원래의
2016-08-08 09:32:20822검색

1 상속, 오버로딩 및 매직 메소드의 의미를 구현하기 위해 상속을 사용하십시오

클래스 B는 A를 확장합니다

선언되면 B는 A에 메소드를 가질 필요가 없습니다

$b=new B();

$b->Method() in A;

$b->Attribute in A=1;

B의 $b->Method();

B의 $b->Method();

If $a=new A();

A의 $a->Method();

$a->A의 속성=1;

불가능

$a->Method() in B;

$a->Method() in B;

오버로딩: B는 A를 상속하고 B에서 구현됩니다. 동일한 메소드 속성 이름은 A.

PHP의 "오버로딩"은 대부분의 다른 객체 지향 언어와 다릅니다. 전통적인 "오버로딩"은 동일한 이름을 가진 여러 클래스 메소드를 제공하는 데 사용되지만 각 메소드는 매개변수 유형과 번호가 다릅니다.

매직 메소드: PHP는 __(밑줄 2개)로 시작하는 모든 클래스 메소드를 매직 메소드로 처리합니다. 따라서 자신만의 클래스 메서드를 정의할 때 앞에 __를 붙이지 마세요.

2 private 및 protected 액세스 수정자 가시성을 사용하여 상속

private 속성 메서드는 상속할 수 없습니다.

protected 속성 메서드는 클래스 외부에서 볼 수 없으며 상속할 수 있습니다

public 속성 메소드로 정의된 클래스 멤버는 어디서든 접근 가능

3 php에서 이중 콜론:: 적용

php 클래스에서 "::" 연산을 자주 볼 수 있음 코드 연산자, 이것은 클래스의 다양한 범위 수준을 최상위로 지정하는 데 사용되는 이중 콜론 "::"으로 표시되는 범위 한정 연산자입니다. 왼쪽은 범위이고 오른쪽은 액세스 범위의 멤버입니다.

php에는 self와 parent라는 두 가지 범위가 정의되어 있습니다(정적 범위는 php6에서 제공됩니다).

범위 결정 연산자(Paamayim Nekudotayim이라고도 함) 또는 간단히 콜론 쌍을 사용하여

정적 멤버, 메서드 및 상수에 액세스할 수도 있습니다. 하위 클래스 에서 사용되어 상위 클래스 의 멤버와 메서드를 재정의합니다.

class MyClass { const
CONST_VALUE = 'A 상수 값';}
echo
MyClass::CONST_VALUE;

class OtherClass 확장 MyClass
{ public static
$my_static = '정적 변수'; 공개 정적 함수
doubleColon () { 에코
부모::CONST_VALUE "n"; 에코
self::$my_static "n"; }
}

OtherClass::doubleColon();

//하위 클래스가 상위 클래스를 덮습니다

class MyClass
{ 보호 함수
myFunc() { echo
"MyClass::myFunc()n"; }
}
class
OtherClass 확장 MyClass
{ 
//상위 클래스의 메서드 재정의
공용 함수 myFunc() {

// 그러나 재정의된 메서드는 계속 호출할 수 있습니다
부모::myFunc(); echo
"OtherClass::myFunc()n" ; }
}

$class = new OtherClass()
$class->myFunc();

4 php The role of this, self 및 parent

this: 다른 객체나 클래스가 아닌 현재 객체 인스턴스에 대한 포인터입니다.

self: 현재 클래스의 범위를 나타냅니다. 이와 달리 클래스의 특정 인스턴스를 나타내지 않습니다. Self는 클래스 외부의 코드에서 사용할 수 없으며 상속 계층에서 자신을 식별할 수 없습니다. 위치. 즉, 확장 클래스에서 self를 사용하면 상위 클래스의 메서드를 호출하지 않고 확장 클래스의 오버로드된 메서드를 호출합니다. Self는 클래스 자체를 가리킵니다. 즉, self는 인스턴스화된 개체를 가리키지 않습니다.

일반적으로 self는 클래스의 정적 변수를 가리키는 데 사용됩니다.

private static $firstCount = 0;
                private $lastCount; //정적 변수를 호출하려면 self를 사용하세요.::(도메인 연산자 기호)
}


parent: 현재 클래스의 부모 클래스의 범위를 나타내며, 나머지는 다음과 같습니다. self의 속성은 동일합니다. parent는 상위 클래스에 대한 포인터입니다.
일반적으로 parent를 사용하여 상위 클래스의 생성자를 호출합니다.

//상속된 클래스 생성자 function __construct( $personSex, $personAge ) {

parent::__construct( "test" ) //부모를 사용하여 The 호출 상위 클래스의 생성자

$this->personSex = $personSex;
$this->personAge = $personAge;
}


5 생성자 및 분석 생성자

생성자가 있는 클래스는 객체가 생성될 때마다 이 메서드를 먼저 호출하므로 객체를 사용하기 전에 몇 가지 초기화 작업을 수행하는 데 매우 적합합니다.

function

__construct

() {}

생성자가 하위 클래스에 정의된 경우 해당 상위 클래스의 생성자는 비밀리에 호출되지 않습니다. 상위 클래스의 생성자를 실행하려면 하위 클래스의 생성자에서 parent::__construct()를 호출해야 합니다.
PHP 5에서는 C++ 등 다른 객체지향 언어와 마찬가지로 소멸자 개념을 도입했습니다. 소멸자는 객체에 대한 모든 참조가 제거되거나 객체가 명시적으로 소멸될 때 실행됩니다.

function __destruct

() {}

최종 키워드 6개
PHP 5 새로운 최종 키워드를 추가했습니다. 상위 클래스의 메서드가 final로 선언되면 하위 클래스는 해당 메서드를 재정의할 수 없습니다. 클래스가 final로 선언되면 상속될 수 없습니다.

7 상속과 생성자

8 인터페이스

표준 클래스를 정의하는 것처럼 인터페이스를 통해 인터페이스를 정의할 수 있습니다.

참고:

1) 그러나 여기에 정의된 모든 메서드는 비어 있습니다.

2) 인터페이스에 정의된 모든 메서드는 이어야 합니다. public, 이것이 인터페이스의 특징입니다.

3) 여러 인터페이스를 구현할 때 인터페이스의 메소드는

4 같은 이름을 가질 수 없습니다. ) 인터페이스는

extends 연산자를 사용하여 상속할 수도 있습니다.

5) 인터페이스에서 상수를 정의할 수도 있습니다. 인터페이스 상수와 클래스 상수는 정확히 동일하게 사용됩니다. 이는 모두 고정된 값이며 하위 클래스나 하위 인터페이스에서 수정할 수 없습니다.

//'iTemplate' 인터페이스 선언
인터페이스 iTemplate
{ 공개 함수
setVariable($name, $var); 공개 함수
getHtml($template);}

// 인터페이스 구현 // 다음 쓰기가 정확합니다.

class
Template implements iTemplate
{
private
$vars = array();
공개 함수
setVariable($name, $var) {

$this->vars[$name] = $var; }

공개 함수
getHtml($template) {
foreach(
$this->vars as $name => $value) { >.
'}', $value, $template); > }}9 속성

클래스의 변수 멤버를 "속성"이라고 합니다. 속성 선언은
public, protected
또는
private
키워드로 시작하고 그 뒤에 변수가 옵니다. 속성의 변수는 초기화가 가능하지만, 초기화되는 값은 상수여야 합니다. 여기서 상수는 컴파일 단계 이후 실행 단계에서 계산되는 상수가 아니라 PHP 스크립트가 컴파일 단계에 있는 상수를 의미합니다.

PHP5에는 해당 속성을 가져오고 할당하기 위해 "__get()" 및 "__set()" 두 함수가 사전 정의되어 있으며, "__isset()"는 속성과 속성 삭제를 위한 "__unset()" 메서드.
간단히 말하면 하나는 값을 얻는 것이고, 다른 하나는 값을 할당하는 것입니다. , "__set()" 및 "__get()" 두 메서드는 기본적으로 존재하지 않지만 생성자 메서드(__construct())와 마찬가지로 클래스에 수동으로 추가됩니다. 물론, 개인 스타일에 따라 이 두 메서드를 추가할 수도 있습니다. //__get() 메서드는 개인 속성을 가져오는 데 사용됩니다.
보기 일반 사본 클립보드로

  1. class Person{ 🎜>//다음은 회원 속성입니다. 사람
  2. 비공개
  3. $name// 사람 이름 비공개
  4. $sex
  5. / /사람 성별 비공개
  6. $age
  7. / /나이 //__get() 메소드를 사용하여 개인 속성을 가져옵니다.
  8. 비공개
  9. 함수
  10. __get($property_name){ if(isset(
  11. $this
  12. ->$property_name)){ 반환(
  13. $this
  14. ->$property_name); }else { return(NULL)
  15. //__set( ) 메소드를 사용하여 비공개로 설정합니다. 속성
  16. 비공개
  17. 함수
  18. __set( $property_name, $value){ $this-> ;
  19. $property_name
  20. = $value; //__isset() 메소드
  21. 비공개
  22. 함수
  23. __isset($nm
  24. ){
  25. echo "isset() 함수 결정 전용 멤버, 자동으로 호출
    "
  26. return
  27. isset($this->$nm
  28. ) 메소드
  29. 비공개 기능 __unset(
  30. $nm
  31. ){
  32. echo
  33. " 비공개 멤버를 삭제하기 위해 클래스 외부에서 unset() 함수를 사용할 때 자동으로 호출됩니다 ;  설정 해제($this->
$nm)

  • } }
  • =
  • 신규 Person(); 🎜>"사람 이름입니다"; //isset() 함수를 사용하여 비공개 멤버를 확인하는 경우 , __isset()이 자동으로 호출됩니다. 이 메서드는 작업을 완료하는 데 도움이 되며 반환 결과는 true입니다.
  • echo var_dump(isset(
  • $p1->name))."
    " $p1
  • ->name.
  • "
    "
    ; 비공개 멤버를 삭제하기 위해 unset() 함수를 사용할 때 이를 완료하는 데 도움이 되는 __unset() 메서드가 자동으로 호출됩니다. 이름 개인 속성 삭제
  • unset(
  • $p1->name); >
  • //삭제되었으므로 이 줄은 출력되지 않습니다.
  • echo $p1->이름;
  • [php] 보기 일반 사본
    1. class Person{ //다음은 person private $의 구성원 속성입니다. name; / /사람의 이름 private $sex; //사람의 나이 //__get() 메소드는 개인 속성을 얻는 데 사용됩니다. __get($property_name){ if(isset($this-> ; $property_name)){ return($this->$property_name);}else
    2. { return (NULL); } } } //__set() 메소드는 개인 속성을 설정하는 데 사용됩니다. 개인 함수 __set($property_name, $value){ $this->$property_name = $value; /__isset () 메소드 private function __isset($nm){ echo "isset() 함수는 비공개 멤버를 결정할 때 자동으로 호출됩니다." return isset($this->$nm) } //__unset() 메소드; 비공개 기능
    3. __unset($nm){ echo "비공개 멤버를 삭제하기 위해 클래스 외부에서 unset() 함수를 사용할 때 자동으로 호출됩니다
      "
      unset($this ->$nm) } } $p1=신규 Person(); $p1->name="사람 이름입니다."; > //isset() 함수를 사용하여 전용 멤버를 측정할 때 __isset() 메서드가 자동으로 호출되어 이를 완료하는 데 도움이 되며 반환 결과는 true입니다. echo var_dump(isset($p1->name))."
      "; echo $p1->name."
      "; //unset() 함수를 사용하여 비공개 멤버를 삭제할 때 __unset() 메서드가 자동으로 호출되어 작업을 완료하고 이름 개인 속성 삭제
    4. unset(
    5. $p1->name); >//삭제되었으므로 이 줄은 출력되지 않습니다. echo $p1->name ?> 10 Clone
    객체 복사 이는 clone 키워드를 사용하여 수행할 수 있습니다(객체에 __clone() 메서드가 있으면 먼저 호출됩니다). 객체의 __clone() 메서드는 직접 호출할 수 없습니다.

    객체가 복사되면 PHP5는 객체의 모든 속성에 대해 "
    얕은 복사

    "를 수행합니다. 모든 속성의

    참조는 변경되지 않고

    유지되며 원래 변수를 가리킵니다. __clone() 메서드가 정의된 경우 새로 생성된 객체(복사로 생성된 객체)의 __clone() 메서드가 호출되며 필요한 경우 속성 값을 수정하는 데 사용할 수 있습니다.

    11 PHP 참조 는 변수, 함수, 객체 등 앞에 & 기호를 추가하는 것입니다. PHP에서 인용된
    은 다른 이름이 동일한 변수 내용에 액세스한다는 의미입니다.
    은 C 언어의 포인터와 다릅니다. C 언어의 포인터는 변수의 내용이 메모리에 저장되는 주소를 저장합니다
    변수 참조
    PHP의 참조를 사용하면 두 개의 변수를 사용하여 가리키는 것이 가능합니다. 같은 내용
    [php]

    $a="ABC";
    $b =&$a;
    echo $a;//여기에 출력: ABC
    echo $b;//여기 출력:ABC
    $b="EFG";
    echo $a;//여기서 $a의 값이 EFG가 되므로 EFG를 출력합니다
    echo $b;//여기에 EFG 출력
    ?>
    [/php]
    함수 전달 호출 주소로
    주소로 전화하는 것에 대해서는 자세히 설명하지 않겠습니다. 코드는 바로 아래에 나와 있습니다
    [php]
    기능 테스트(& $a)
    {
    $a=$a+100;
    }
    $ b=1;
    echo $b;//출력 1
    test($b); //$b가 함수에 전달되는 내용 여기 실제로는 $b 변수 내용이 있는 메모리 주소입니다.
    echo "
    "; 함수에서 $a의 값을 변경하여 $b의 값을 변경할 수 있습니다.

    echo $b;//출력 101
    [/php]
    테스트할 경우 주의해야 할 사항(1) ; 여기서 오류가 발생합니다.
    함수
    의 참조 반환을 먼저 생각해보세요.
    [php]
    function &test ()
    {
    static $b=0;//정적 변수 선언
    $b=$b+1;
    echo $b;
    return $b;
    }
    $a=test( );//이 명령문은 $b의 값을 1로 출력합니다
    $a=5;
    $a=test();//이 문은 $b의 값이 2로 출력됩니다.
    $a=&test();//이 문은 $의 값이 출력됩니다. b as 3
    $a=5 ;
    $a=test();//이 명령문은 $b의 값을 6으로 출력합니다
    [/php]
    아래 설명:
    이런 식으로 $a=test(); 얻는 것은 실제로 함수 참조 반환이 아닙니다. , 이는 일반적인 함수 호출과 다르지 않습니다. 이유는 다음과 같습니다. PHP
    PHP에서는 $a=&test()를 통해 함수의 참조 반환을 얻도록 규정되어 있습니다. ;
    참조 반환이 무엇인지에 대해(PHP 설명서에 따르면 참조 반환은 참조가 바인딩되어야 하는 변수를 찾기 위해 함수를 사용하려고 할 때 사용됩니다.) ) 이 말도 안되는 소리 때문에 오랫동안 이해할 수 없었습니다.
    위의 예를 사용하여 설명하면 $a=test() 메서드에서 함수를 호출하는 것입니다. 함수의 값은 단지 $a에 할당되었으며 $a에 대한 변경 사항은 함수의 $b
    에 영향을 미치지 않습니다. $a=&test()를 통해 함수를 호출할 때 해당 함수는 다음과 같습니다. $b를 반환하는 $b 변수의 메모리 주소와 $a 변수의 메모리 주소는 동일한 위치
    를 가리키며, 이는 이 효과와 동등한 결과를 생성합니다($a=&b;) 그래서 $를 변경하면 a의 값도 $b의 값을 변경하므로
    $a=&test();
    $a=5;
    이후 $b의 값은 5가 됩니다
    여기서는 함수의 참조 반환을 모두가 이해할 수 있도록 정적 변수를 사용합니다. 이 함수는 주로 객체에서 사용됩니다
    객체 참조
    [php]

    클래스 A{
    var $abc="ABC";
    }
    $b=new a;
    $c=$ b;
    echo $b->abc;//ABC를 여기에 출력
    echo $c->abc; //ABC를 여기에 출력
    $b->abc="DEF";
    echo $c->abc;//DEF를 여기에 출력
    ?>
    [/php]
    위 코드는 PHP5의 실행 효과입니다.
    PHP5에서는 객체 복사가 참조를 통해 이루어집니다. 위 열에서 $b=new a; $c=$b; 는 $c=&$b;
    PHP5의 기본값은 다음과 같습니다. 하지만 때로는 객체의 복사본을 만들고 원본 객체의 변경 사항이 복사본에 영향을 주지 않기를 바랄 수도 있습니다.
    참조의 역할
    프로그램의 규모가 비교적 크고, 동일한 객체를 참조하는 변수가 많아 객체를 사용한 후 수동으로 지우고 싶다면 개인적으로 "& " 메서드를 사용하고 $var =null 메서드를 사용하여 삭제합니다. 그렇지 않으면 php5의 기본 메서드를 사용합니다. 또한 php5에서 큰 배열을 전송하려면 "&" 메서드를 사용하는 것이 좋습니다. 메모리 공간을 절약합니다.
    참조 취소
    참조를 설정 해제하면 변수 이름과 변수 콘텐츠 간의 바인딩이 끊어집니다. 이는 변수 내용이 삭제된다는 의미는 아닙니다.예:

    $a = 1;
    $b =& $ a ;
    설정 해제($a);
    ?>
    는 $b를 설정 해제하지 않고 $a만 해제합니다.
    전역 참조
    global $var로 변수를 선언하면 실제로 전역 변수에 대한 참조가 설정됩니다. 즉,

    $var =& $GLOBALS["var"]를 수행하는 것과 같습니다. ;
    ?>
    예를 들어 unset $var는 전역 변수를 설정 해제하지 않음을 의미합니다.
    $this
    객체의 메서드에서 $this는 항상 이를 호출하는 객체에 대한 참조입니다.
    //또 다른 작은 에피소드
    PHP에서 주소의 포인팅(포인터와 유사한) 기능은 사용자가 직접 구현하는 것이 아니라, Zend 코어의 PHP 참조는 "쓰기 시 복사" 원칙을 채택합니다. 즉, 쓰기 작업이 발생하지 않는 한 동일한 주소를 가리키는 변수나 개체는 복사되지 않습니다.
    일반 용어로
    1: 다음 코드가 있는 경우
    [php]
    $a="ABC";
    $b=$a;
    [/php]
    실제로 이때 $a와 $b가 서로 다른 메모리를 차지하는 것이 아니라 $a와 $b가 모두 동일한 메모리 주소를 가리키고 있습니다
    2: 위 코드에 다음 코드를 추가하면
    [php]
    $a="EFG";
    [/php]
    $a와 $b가 가리키는 메모리의 데이터를 다시 작성해야 하므로 이때 Zend 코어는 $b에 대한 $a의 데이터 복사본을 자동으로 결정하고 자동 생성한 후 다시 적용합니다. 기억의 한 조각

    이상 내용의 측면을 포함하여 객체지향 PHP의 본질을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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