PHP 완전 자율 학습 매뉴...login
PHP 완전 자율 학습 매뉴얼
작가:php.cn  업데이트 시간:2022-04-15 13:53:54

PHP 객체지향


PHP 객체지향이란 무엇인가요?

객체지향 프로그래밍(영어: Object- Oriented 프로그래밍, 약어: OOP)에 있어서, An 객체는 정보와 정보 처리 방법에 대한 설명으로 구성된 전체입니다. 현실 세계의 추상화입니다.

현실 세계에서 우리가 마주하는 사물은 컴퓨터, 텔레비전, 자전거 등의 사물입니다.

관련 학습 권장 사항: "PHP 객체 지향 프로그래밍(옥녀심경편)", "MySQLi 객체 지향 프로그래밍 빠른 시작 "

객체의 세 가지 주요 특징:

  • 객체의 동작: 객체에 어떤 작업을 적용할 수 있는지, 불을 켜고 끄는 것이 행동입니다.

  • 객체의 모양: 해당 메소드를 적용했을 때 객체가 반응하는 방식, 색상, 크기, 모양.

  • 객체의 표현: 객체의 표현은 신분증과 동일하며, 구체적으로 동일한 행동과 상태에서 차이를 구별한다.

예를 들어 Animal은 개와 양을 지정할 수 있는 추상 클래스이고 개와 양은 색상 속성을 갖고 있으므로 실행할 수 있습니다. 그리고 다른 행동 상태.

1020.png


객체 지향 콘텐츠

  • 클래스 − 사물의 추상적인 특성을 정의합니다. 클래스의 정의에는 데이터의 형식과 데이터에 대한 작업이 포함됩니다.

  • Object - 클래스의 인스턴스입니다.

  • 멤버 변수 - 클래스 내부에 정의된 변수. 이 변수의 값은 외부 세계에는 보이지 않지만 멤버 함수를 통해 액세스할 수 있습니다. 클래스가 객체로 인스턴스화되면 변수를 객체의 속성이라고 부를 수 있습니다.

  • 멤버 함수 - 클래스 내부에 정의되어 있으며 객체의 데이터에 액세스하는 데 사용할 수 있습니다.

  • 상속 − 상속은 하위 클래스가 상위 클래스의 데이터 구조와 메서드를 자동으로 공유하는 메커니즘입니다. 클래스를 정의하고 구현할 때 기존 클래스를 기반으로 할 수 있고, 기존 클래스에서 정의한 콘텐츠를 자신의 콘텐츠로 가져와서 새로운 콘텐츠를 추가할 수 있습니다.

  • 부모 클래스 − 클래스는 다른 클래스에 의해 상속됩니다. 이 클래스는 부모 클래스, 기본 클래스 또는 슈퍼 클래스라고 할 수 있습니다.

  • 하위 클래스 − 다른 클래스를 상속하는 클래스를 하위 클래스 또는 파생 클래스라고 합니다.

  • 다형성 − 다형성은 동일한 작업이나 기능 또는 프로세스가 여러 유형의 개체에 적용되어 서로 다른 결과를 얻을 수 있음을 의미합니다. 동일한 메시지를 수신할 때 서로 다른 객체가 서로 다른 결과를 생성할 수 있는 현상을 다형성이라고 합니다.

  • 오버로딩 - 간단히 말하면, 이름은 같지만 매개변수 목록이 다른 함수나 메소드가 있는 상황입니다. 매개변수 서로 오버로드된 함수나 메소드를 호출합니다.

  • 추상성 − 추상화란 일관된 데이터 구조(속성)와 동작(작업)을 가진 객체를 클래스로 추상화하는 것을 말합니다. 클래스는 관련 없는 콘텐츠를 무시하면서 애플리케이션과 관련된 중요한 속성을 반영하는 추상화입니다. 모든 클래스의 구분은 주관적이지만 특정 응용 프로그램과 관련되어야 합니다.

  • 캡슐화 − 캡슐화란 현실 세계에 존재하는 객체의 속성과 동작을 하나로 묶어 논리적 단위 내에 배치하는 것을 말합니다.

  • 생성자 - 주로 객체 생성 시 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기값을 할당하는 데 항상 함께 사용됩니다. new 연산자를 사용하여 문장에 객체를 생성합니다.

  • 소멸자 - 소멸자(소멸자) 생성자와 달리 객체의 수명 주기가 종료되는 경우(예: 객체가 위치한 함수가 호출됨) ) , 시스템은 자동으로 소멸자를 실행합니다. 소멸자는 종종 "정리" 작업을 수행하는 데 사용됩니다(예를 들어 객체를 생성할 때 new를 사용하여 메모리 공간을 엽니다. 메모리 공간은 종료하기 전에 소멸자에서 삭제와 함께 해제되어야 합니다).

아래 그림에서는 Car 클래스를 통해 Mercedes, Bmw, Audi라는 세 가지 개체를 만들었습니다.

아아아아

1012.jpg


PHP 클래스 정의

PHP 정의 클래스는 일반적으로 다음과 같은 구문 형식을 갖습니다.

$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
는 다음과 같이 분석됩니다. 다음:
  • 클래스는 class 키워드와 클래스 이름을 사용하여 정의됩니다.

  • 클래스 이름 뒤의 중괄호({}) 안에 변수와 메서드를 정의할 수 있습니다.

  • 클래스의 변수는 var을 사용하여 선언하며, 변수도 값으로 초기화할 수 있습니다.

  • 함수 정의는 PHP 함수 정의와 유사하지만 함수는 클래스와 클래스가 인스턴스화하는 개체를 통해서만 액세스할 수 있습니다.

Instance

<?php
class phpClass {
  var $var1;
  var $var2 = "constant string";
  
  function myfunc ($arg1, $arg2) {
     [..]
  }
  [..]
}
?>
변수 $this는 그 자체의 객체를 나타냅니다.

PHP_EOL은 개행 문자입니다.


PHP에서 객체 생성

클래스가 생성된 후 new 연산자를 사용하여 이 클래스의 객체를 인스턴스화할 수 있습니다.

<?php
class Site {
  /* 成员变量 */
  var $url;
  var $title;
  
  /* 成员函数 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}
?>
위 코드에서는 세 개의 객체를 생성했습니다. 세 객체는 각각 독립적입니다. 다음으로 멤버 메서드와 멤버 변수에 액세스하는 방법을 살펴보겠습니다.

멤버 메소드 호출

객체를 인스턴스화한 후 객체를 사용하여 멤버 메소드를 호출할 수 있습니다. 객체의 멤버 메소드는 객체의 멤버 변수만 작동할 수 있습니다. 🎜>

멤버 함수 호출, 제목 및 URL 설정


$php = new Site;
$taobao = new Site;
$google = new Site;
가 멤버 함수 호출, 제목 및 URL 가져오기
$php->setTitle( "php中文网" );
$taobao->setTitle( "淘宝" );
$google->setTitle( "Google 搜索" );
$php->setUrl( 'www.php.cn' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );

전체 코드는 다음과 같습니다.

Instance

$php->getTitle();
$taobao->getTitle();
$google->getTitle();
$php->getUrl();
$taobao->getUrl();
$google->getUrl();

인스턴스 실행»"인스턴스 실행"을 클릭합니다. 온라인 인스턴스를 보려면 버튼

위 코드를 실행하면 출력 결과는 다음과 같습니다.

<?php 
class Site { 
  /* 成员变量 */ 
  var $url; 
  var $title; 
   
  /* 成员函数 */ 
  function setUrl($par){ 
     $this->url = $par; 
  } 
   
  function getUrl(){ 
     echo $this->url . PHP_EOL; 
  } 
   
  function setTitle($par){ 
     $this->title = $par; 
  } 
   
  function getTitle(){ 
     echo $this->title . PHP_EOL; 
  } 
} 

$php = new Site; 
$taobao = new Site; 
$google = new Site; 

// 调用成员函数,设置标题和URL 
$php->setTitle( "php中文网" ); 
$taobao->setTitle( "淘宝" ); 
$google->setTitle( "Google 搜索" ); 

$php->setUrl( 'www.php.cn' ); 
$taobao->setUrl( 'www.taobao.com' ); 
$google->setUrl( 'www.google.com' ); 

// 调用成员函数,获取标题和URL 
$php->getTitle(); 
$taobao->getTitle(); 
$google->getTitle(); 

$php->getUrl(); 
$taobao->getUrl(); 
$google->getUrl(); 
?>

PHP 생성자

생성자는 특별한 메소드입니다. 주로 객체를 생성할 때 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기값을 할당하는 데 사용됩니다. 객체를 생성하는 문에서는 항상 new 연산자와 함께 사용됩니다.

PHP 5에서는 개발자가 클래스의 생성자로 메서드를 정의할 수 있습니다. 구문 형식은 다음과 같습니다.

php中文网
淘宝
Google 搜索
www.php.cn
www.taobao.com
www.google.com
위의 예에서는 생성자 메서드를 통해 초기화할 수 있습니다. $url 및 $title 변수:
void __construct ([ mixed $args [, $... ]] )
이제 setTitle 및 setUrl 메소드를 호출할 필요가 없습니다.
Instance

function __construct( $par1, $par2 ) {
   $this->url = $par1;
   $this->title = $par2;
}

인스턴스 실행»온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 클릭하세요


소멸자

소멸자(소멸자) 생성자와는 반대로 객체의 생명주기가 종료되면(예를 들어 객체가 위치한 함수가 호출된 경우) 시스템이 자동으로 실행하는 소멸자.

PHP 5에서는 다른 객체 지향 언어와 유사한 소멸자 개념을 도입했습니다. 구문 형식은

<?php
class Site {
  /* 成员变量 */
  var $url;
  var $title;

  function __construct( $par1, $par2 ) {
    $this->url = $par1;
    $this->title = $par2;
  }
  /* 成员函数 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

$php = new Site('www.php.cn', 'php中文网'); 
$taobao = new Site('www.taobao.com', '淘宝'); 
$google = new Site('www.google.com', 'Google 搜索'); 

// 调用成员函数,获取标题和URL 
$php->getTitle(); 
$taobao->getTitle(); 
$google->getTitle(); 

$php->getUrl(); 
$taobao->getUrl(); 
$google->getUrl();
?>
Instance<🎜입니다. >
void __destruct ( void )
가 위 코드를 실행하고 출력 결과는 다음과 같습니다.
<?php
class MyDestructableClass {
   function __construct() {
       print "构造函数\n";
       $this->name = "MyDestructableClass";
   }
   function __destruct() {
       print "销毁 " . $this->name . "\n";
   }
}
$obj = new MyDestructableClass();
?>

상속됨

PHP는 클래스를 상속하기 위해

extends 키워드를 사용합니다. PHP는 다중 상속을 지원하지 않습니다.

构造函数
销毁 MyDestructableClass

예제의 Child_Site 클래스는 Site 클래스를 상속하고 기능을 확장합니다.

class Child extends Parent {
   // 代码部分
}

메서드 재정의

상위 클래스에서 상속된 메서드가 하위 클래스의 요구 사항을 충족할 수 없는 경우 이를 다시 작성할 수 있습니다. 이 프로세스를 메서드 재작성이라고도 합니다.

getUrl 및 getTitle 메소드는 인스턴스에서 재정의됩니다.

<?php 
// 子类扩展站点类别
class Child_Site extends Site {
   var $category;
function setCate($par){
$this->category = $par;
}
  
function getCate(){
echo $this->category . PHP_EOL;
}
}

액세스 제어

속성에 대한 PHP 또는 메서드 앞에 public, protected 또는 private 키워드를 추가하여 메서드에 대한 액세스 제어를 수행합니다.

  • 공개: 공개 클래스 구성원은 어디서나 액세스할 수 있습니다.

  • protected: Protected 클래스 멤버는 해당 클래스 멤버와 해당 하위 클래스 및 상위 클래스에서 액세스할 수 있습니다.

  • private(비공개): Private 클래스 멤버는 자신이 정의된 클래스에서만 접근할 수 있습니다.

속성 접근 제어

클래스 속성은 public, protected, private 중 하나로 정의되어야 합니다. var로 정의하면 공개로 간주됩니다.

function getUrl() {
   echo $this->url . PHP_EOL;
   return $this->url;
}
   
function getTitle(){
   echo $this->title . PHP_EOL;
   return $this->title;
}
메서드에 대한 액세스 제어

클래스의 메서드는 공개, 비공개 또는 보호로 정의될 수 있습니다. 이러한 키워드가 설정되지 않은 경우 메서드는 기본적으로 public으로 설정됩니다.

<?php
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 可以对 public 和 protected 进行重定义,但 private 而不能
    protected $protected = 'Protected2';
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>

인터페이스

인터페이스를 사용하면 클래스가 구현해야 하는 메소드를 지정할 수 있지만 정의할 필요는 없습니다. 메소드의 특정 내용입니다.

인터페이스는 표준 클래스 정의와 마찬가지로

interface 키워드를 통해 정의되지만, 여기에 정의된 모든 메소드는 비어 있습니다.

인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특징입니다.

인터페이스를 구현하려면

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

아아앙

상수

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

상수의 값은 고정된 값이어야 하며 변수, 클래스 속성, 수학 연산의 결과 또는 함수 호출이 될 수 없습니다.

PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드(예: self, parent 또는 static)일 수 없습니다.

인스턴스

<?php
/**
 * Define MyClass
 */
class MyClass
{
    // 声明一个公有的构造函数
    public function __construct() { }
    // 声明一个公有的方法
    public function MyPublic() { }
    // 声明一个受保护的方法
    protected function MyProtected() { }
    // 声明一个私有的方法
    private function MyPrivate() { }
    // 此方法为公有
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}
$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行
/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 此方法为公有
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // 这行会产生一个致命错误
    }
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }
    public function testPublic() {
        echo "Bar::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}
class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

추상 클래스

모든 클래스(적어도 하나의 메소드가 다음으로 선언된 경우) abstract이면 클래스를 abstract로 선언해야 합니다.

추상으로 정의된 클래스는 인스턴스화할 수 없습니다.

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

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다.

<?php
// 声明一个'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}
// 实现接口
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}
가 위 코드를 실행하고 출력 결과는 다음과 같습니다.
<?php
class MyClass
{
    const constant = '常量值';
    function showConstant() {
        echo  self::constant . PHP_EOL;
    }
}
echo MyClass::constant . PHP_EOL;
$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起
$class = new MyClass();
$class->showConstant();
echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>

정적 키워드

클래스 특성이나 메서드를 정적으로 선언하면 클래스를 인스턴스화하지 않고도 직접 액세스할 수 있습니다.

정적 속성은 인스턴스화된 클래스의 객체를 통해 액세스할 수 없습니다(그러나 정적 메서드는 가능함).

정적 메서드에서는 개체 호출이 필요하지 않으므로 정적 메서드에서는 의사 변수 $this를 사용할 수 없습니다.

객체는 -> 연산자를 통해 정적 속성에 액세스할 수 없습니다.

PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드 self, parent 또는 static일 수 없습니다.

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}
class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>
는 위 프로그램을 실행하고 출력 결과는 다음과 같습니다.
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

최종 키워드

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

다음 코드 실행은 오류를 보고합니다.

<?php
class Foo {
  public static $my_static = 'foo';
  
  public function staticValue() {
     return self::$my_static;
  }
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>

상위 클래스 생성자 호출

PHP는 not 클래스의 생성자는 상위 클래스의 생성자를 자동으로 호출합니다. 상위 클래스의 생성자를 실행하려면 하위 클래스의 생성자에서 parent::__construct()를 호출해야 합니다.

foo
foo
가 위 프로그램을 실행하고 출력 결과는 다음과 같습니다.
<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called" . PHP_EOL;
   }
   
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called"  . PHP_EOL;
   }
}
class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called"  . PHP_EOL;
   }
}
// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>