PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까?
PHP에서 레이트 스태틱바인딩이란 정확히 무엇입니까?
반드시 PHP 매뉴얼의 Late Static Bindings를 읽어야 합니다.하지만 간단히 요약해 드리겠습니다.
부터 말하자면, 이 말은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.self
키워드는 같은 상속 규칙을 따르지 않습니다. self
는 항상 사용되는 클래스로 해결됩니다., 클래스에서 , " ", "는 " 클래스합니다.self
는 예상대로 아이를 참조하지 않습니다.
레이트 합니다.static
키워드를 지정합니다.「 」를 사용하는 static
'무엇보다'
그 뒤에 있는 두 가지 기본적인 개념입니다. ★★★self
,parent
★★★★★★★★★★★★★★★★★」static
조작하다static
은 미묘할 수 있기 때문에, 보다 상세하게 설명하는 것보다, 메뉴얼 페이지의 예를 학습하는 것을 강하게 추천합니다.각 키워드의 기본을 이해한 후에는 어떤 결과를 얻을 수 있는지 보기 위해 예가 매우 필요합니다.
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_dump
에someFunction
다음과 같습니다.
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
'programing' 카테고리의 다른 글
Python을 단순하게 설정Windows 상의 HTTP 서버 (0) | 2022.09.17 |
---|---|
Django 중첩 쿼리 (0) | 2022.09.17 |
정수를 롱으로 변환 (0) | 2022.09.16 |
물체를 어떻게 파괴합니까? (0) | 2022.09.16 |
numpy dtype을 네이티브 python 형식으로 변환하는 중 (0) | 2022.09.16 |