>  기사  >  백엔드 개발  >  PHP 클래스 자체와 정적의 차이점은 무엇입니까? 그것을 사용하는 방법?

PHP 클래스 자체와 정적의 차이점은 무엇입니까? 그것을 사용하는 방법?

藏色散人
藏色散人앞으로
2021-09-09 11:00:593768검색

대부분의 PHP 사용자에게 self와 static 두 키워드는 낯설지 않습니다. self::xxxx를 통해 현재 클래스의 정적 속성과 메서드를 호출하는 방법을 배웁니다. 그리고 정적은 어떻습니까? 많은 사람들은 이것이 정적 메소드와 클래스 속성 키워드를 정의하는 데 사용된다는 것을 알아야 합니다. self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。

这也是我之前的认知。

现在我们来回顾一下这两个关键词的一些常见用法:

// self 用法 1 :调用静态成员属性
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

    public function test()
    {
        echo self::$maxAddressCount;
    }
}

$person = new Person();
$person->test();
// self 用法 2 :调用静态方法
<?php
class Person
{
    protected static $maxAddressCount = 5; // 收获地址创建最大数量。

    protected static function getMaxAddressCount()
    {
        return self::$maxAddressCount;
    }

    public function test()
    {
        echo self::getMaxAddressCount();
    }
}

$person = new Person();
$person->test();
// self 用法 3 :创建一个当前对象
<?php
// 单例示例
class Person
{
    private static $instance = null;

    private function __construct() {}

    final public static function getInstance() 
    {
        if (self::$instance == null) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function test()
    {
        echo "hello world!";
    }
}

$person = Person::getInstance();
$person->test();
关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。

我深信上面的用法,任何一个入门的 PHPer 都是非常熟悉的。现在我要讲的是以下两种方式:

new self() 与 new static() 的区别?

我相信很多人都知道new self()创建一个当前类的对象,并不知道new static()也能创建一个当前类的对象。

关于new static()这种用法呢,在官方文档有说明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

PHP 官方把这种方式称为:后期静态绑定。

官方示例 1:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

因为 Class B 继承了 Class A。 A 与 B 都有一个静态方法who()。此时通过B::test()的时候,调用的实际上是 Class A 的who()方法。

因为子类 Class B 的静态方法who()属于在 Class A 之后的子类里面才定义的。而 PHP 的默认特性只允许调用最先定义的。

就这引出了后期静态绑定的概念。

官方示例 2:

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

我们把 Class A 里面的test()方法体的self更改为static

이것은 제가 이전에 이해한 바이기도 합니다.

이제 이 두 키워드의 일반적인 용도를 검토해 보겠습니다.

rrreeerrreeerrreee

정적 키워드의 일반적인 용도도 위의 3가지 예에 포괄적으로 반영되어 있습니다.
저는 모든 초급 PHPer가 위의 사용법에 매우 익숙할 것이라고 굳게 믿습니다. 이제 제가 이야기하고 싶은 것은 다음 두 가지 방법입니다.
rrreee

new self()가 현재 클래스의 객체를 생성한다는 것은 알고 있지만 new static은 모르는 분들이 많을 거라 생각합니다. () code>는 현재 클래스의 객체를 생성할 수도 있습니다. new static() 사용법은 공식 문서에 설명되어 있습니다. 주소: https://www.php.net/manual/zh/언어.oop5.late-static-bounds.php

🎜PHP는 공식적으로 이 방법을 늦은 정적 바인딩이라고 부릅니다. 🎜🎜🎜공식 예 1: 🎜rrreee🎜클래스 B가 클래스 A를 상속하기 때문입니다. A와 B 모두 정적 메서드 who()를 가지고 있습니다. 이때 B::test()를 전달하면 실제로 호출되는 것은 Class A의 who() 메서드이다. 🎜🎜클래스 B 서브클래스의 정적 메소드 who()가 클래스 A 뒤의 서브클래스에 정의되어 있기 때문입니다. PHP의 기본 기능은 처음 정의된 기능만 호출하도록 허용합니다. 🎜🎜이것은 후기 정적 바인딩의 개념으로 이어집니다. 🎜🎜공식 예시 2:🎜rrreee🎜클래스 A의 test() 메서드 본문의 selfstatic으로 변경한 후 static은 은 항상 호출 클래스를 가리킵니다. 즉, 클래스 A 상위 클래스에 정의된 메서드가 동일한 이름을 가진 하위 클래스와 충돌하더라도 발생합니다. 그러나 서브클래스가 이를 호출하면 자동으로 동일한 이름을 가진 서브클래스의 정적 메서드로 전환됩니다. 발신자에 따라 다릅니다. 🎜🎜위의 두 가지 예시를 실행해보면 이해하실 수 있습니다. 🎜🎜이 섹션의 이유. 실제 작업 중에 싱글톤 방식을 상속받아야 했기 때문에 이런 문제가 발생했습니다. 따라서 이 기능이 포함됩니다. 🎜🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜🎜

위 내용은 PHP 클래스 자체와 정적의 차이점은 무엇입니까? 그것을 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제