programing

PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까?

bestcode 2022. 9. 16. 00:06
반응형

PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까?

PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까?

반드시 PHP 매뉴얼의 Late Static Bindings를 읽어야 합니다.하지만 간단히 요약해 드리겠습니다.

부터 말하자면, 이 말은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.self키워드는 같은 상속 규칙을 따르지 않습니다. self는 항상 사용되는 클래스로 해결됩니다., 클래스에서 , " ", "는 " 클래스합니다.self는 예상대로 아이를 참조하지 않습니다.

레이트 합니다.static키워드를 지정합니다.「 」를 사용하는 static'무엇보다'

그 뒤에 있는 두 가지 기본적인 개념입니다. ★★★self,parent ★★★★★★★★★★★★★★★★★」static 조작하다static은 미묘할 수 있기 때문에, 보다 상세하게 설명하는 것보다, 메뉴얼 페이지의 예를 학습하는 것을 강하게 추천합니다.각 키워드의 기본을 이해한 후에는 어떤 결과를 얻을 수 있는지 보기 위해 예가 매우 필요합니다.

PHP에서: 최신 정적 바인딩 - 수동:

PHP 5.3.0에서 PHP는 레이트 스태틱바인딩이라는 기능을 구현하고 있습니다.이 기능은 스태틱 상속 컨텍스트에서 호출된 클래스를 참조하기 위해 사용할 수 있습니다.

레이트 스태틱바인딩은 런타임에 처음 호출된 클래스를 참조하는 키워드를 도입함으로써 이 제한을 해결하려고 합니다.키워드를 , 「」를 되었습니다.static이미 예약되어 있습니다.

예를 들어 보겠습니다.

<?php
    class Car
    {
        public static function run()
        {
            return static::getName();
        }

        private static function getName()
        {
            return 'Car';
        }
    }

    class Toyota extends Car
    {
        public static function getName()
        {
            return 'Toyota';
        }
    }

    echo Car::run(); // Output: Car
    echo Toyota::run(); // Output: Toyota
?>

레이트 스태틱바인딩은 마지막 "non-forwarding call"에서 명명된 클래스를 저장함으로써 동작합니다.은 「」의에 있는 입니다).::operator포워딩 도입self::,parent::,static:: 클래스 " " " " 입니다forward_static_call().기능get_called_class()는, 과 「」의 이름을 가지는 문자열을 할 수 .static::에 그 범위를 나타냅니다.

명백한 동작은 없습니다.

다음 코드는 '알파벳타'를 생성합니다.

class alpha {

    function classname(){
        return __CLASS__;
    }

    function selfname(){
        return self::classname();
    }

    function staticname(){
        return static::classname();
    }
}

class beta extends alpha {

    function classname(){
        return __CLASS__;
    }
}

$beta = new beta();
echo $beta->selfname(); // Output: alpha
echo $beta->staticname(); // Output: beta

그러나 베타 클래스에서 classname 함수 선언을 제거하면 결과적으로 'alpha'가 나옵니다.

'PHP 마스터가 최첨단 코드를 작성한다'라는 책에서 인용하고 있습니다.

레이트 스태틱바인딩은 php 5.3에서 도입된 기능입니다.이를 통해 부모 클래스에서 정적 메서드를 상속하고 호출되는 자식 클래스를 참조할 수 있습니다.

즉, static 메서드를 사용하여 추상 클래스를 만들고 self::method() 대신 static:method() 표기를 사용하여 자 클래스의 구체적인 구현을 참조할 수 있습니다.

php 공식 문서도 자유롭게 봐주세요.http://php.net/manual/en/language.oop5.late-static-bindings.php


Late Static Binding을 설명하는 가장 명확한 방법은 프랙티클의 예를 사용하는 것입니다.템플릿 방식 패턴으로 사용하고 있습니다.이하를 참조해 주세요.

abstract class AbstractTemplate {
    
    public const AWESOME_LIST = [''];
    
    public function someFunction(): void {
        $awesomeList = $this->getAwesomeList();

        // OUTPUT: ['harry','henk','john'];
        var_dump($awesomeList); 
    }


    /**
     * This function gets static constants from CHILD classes
     */
    public function getAwesomeList(): array
    {
        return static::AWESOME_LIST;
    }
}

class ConcreteTemplate extends AbstractTemplate {
    
    public const AWESOME_LIST = ['harry','henk','john'];
    
    public function someFunction(): void {
        parent::someFunction();
    }
}

$concreteTemplate = new ConcreteTemplate();
$concreteTemplate->someFunction();

주의:static메서드의 키워드getAwesomeList이제 조금 바꿔보겠습니다.

public function getAwesomeList(): array
{
    return self::AWESOME_LIST;
}

의 출력var_dumpsomeFunction다음과 같습니다.

array (size=1)
  0 => string '' (length=0)

static키워드는 싱글톤 설계 패턴에서 사용됩니다.링크 참조: https://refactoring.guru/design-patterns/singleton/php/example

차이를 보여주는 가장 간단한 예제입니다.
주의, 자기:: $c

class A
{
    static $c = 7;

    public static function getVal()
    {
        return self::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 7

레이트 스태틱바인딩, 주의 스태틱:: $c

class A
{
    static $c = 7;

    public static function getVal()
    {
        return static::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 8

「왜 이것을 사용하는가」라고 하는 관점에서 보면, 기본적으로는, 스태틱 방식의 해석이나 실행의 콘텍스트를 변경하는 방법이 됩니다.

와 함께self의 컨텍스트는 처음에 메서드를 정의한 컨텍스트입니다.와 함께static전화하신 분입니다.

예를 들어 다음과 같습니다.

abstract class Builder {
    public static function build() {
        return new static;
    }
}

class Member extends Builder {
    public function who_am_i() {
         echo 'Member';
    }
}

Member::build()->who_am_i();

또한 하위 클래스의 정적 변수를 업데이트하는지 확인하십시오.어린이 B가 어린이 C를 업데이트한다는 뜻밖의 결과를 발견했습니다.

class A{
    protected static $things;
}

class B extends A {
    public static function things(){
        static::$things[1] = 'Thing B';
        return static::$things; 
    }
}

class C extends A{
    public static function things(){
        static::$things[2] = 'Thing C';
        return static::$things;        
    }
}

print_r(C::things());
// Array (
//   [2] => Thing C
// )

B::things();

print_r(C::things()); 
// Array (
//    [2] => Thing C
//    [1] => Thing B
// )

각 자식 클래스에 동일한 변수를 선언하면 다음과 같이 수정할 수 있습니다.

class C extends A{
    protected static $things; // add this and B will not interfere!

    public static function things(){
        static::$things[2] = 'Thing C';
        return static::$things;        
    }
}

언급URL : https://stackoverflow.com/questions/1912902/what-exactly-are-late-static-bindings-in-php

반응형