>  기사  >  백엔드 개발  >  PHP에서 지연된 정적 바인딩 사용에 대한 자세한 설명

PHP에서 지연된 정적 바인딩 사용에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-17 11:47:301745검색

이번에는 PHP에서 지연된 정적 바인딩을 사용하는 방법에 대해 자세히 설명하겠습니다. PHP에서 지연된 정적 바인딩을 사용할 때 주의 사항은 무엇입니까? 다음은 실제 사례입니다.

소위 지연된 정적 바인딩은 이름에서 알 수 있듯이 정적으로 호출할 때 :: 기호 왼쪽의 바인딩이 지연됩니다. 즉, 더 이상 해당 클래스가 있는 클래스로 구문 분석되지 않습니다. 현재 메서드가 정의되어 있지만 실제 런타임 중에 계산됩니다. 이번 글에서는 주로 PHP 지연 정적 바인딩에 대한 관련 내용을 소개합니다. 아래에서는 자세히 설명하지 않겠습니다. 자세한 소개를 살펴보겠습니다.

뭔가 안 좋은 냄새가 나네요

이 기간 동안 프로젝트 백그라운드에서 PHP 코드를 보다가 다음과 비슷한 코드를 보았습니다.

<?php
 class DBHandler {
  function get() {}
 }
 class MySQLHandler extends DBHandler {
  // 这里一个create
  public static function create() {
   echo "MySQL";
   return new self();
  }
  public function get() {
   echo "MySQL get()";
  }
 }
 class MemcachedHandler extends DBHandler {
  // 这里又有一个create
  public static function create() {
   echo "Memcached";
   return new self();
  }
  public function get() {
   echo "Memcached get";
  }
 }
 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

Do you. 뭔가 나쁜 냄새가 나나요? 보시다시피 MySQLHandler 및 MemcachedHandler 클래스에 생성 함수가 있습니다. 출력 문을 제거한 후 이것이 코드 중복이라는 것을 알았습니다. 예, 코드 리팩토링이 필요합니다.

간단한 리팩토링 수행

코드 리팩토링은 어디에나 있습니다. 생각해보고 개선이 있다고 느끼면 키보드를 누르고 작업을 시작해야 합니다. 자, 위의 코드를 다음과 같이 리팩터링하세요.

<?php
 class DBHandler {
  public static function create() {
   echo "create";
   return new self();
  }
  function get() {}
 }
 class MySQLHandler extends DBHandler {
  public function get() {
   echo "MySQL get()";
  }
 }
 class MemcachedHandler extends DBHandler {
  public function get() {
   echo "Memcached get";
  }
 }
 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

create 함수를 DBHandler 클래스로 이동하세요. 보기에는 좋아 보입니다. 잘못된 코드가 하나 이상 제거되었습니다.

잘못된 것 같습니다

실행해 보았는데 예상한 대로 인쇄되지 않았습니다. MySQL get()  。什么情况?这说明,并没有调用MySQLHandler的get函数,但是代码明明调用了啊,这说明, new self() 이 코드에 문제가 있습니다. 이게 뭐가 문제야? 이는 오늘 요약의 초점인 지연된 정적 바인딩으로 이어집니다.

지연 정적 바인딩

지연 정적 바인딩은 PHP5.3 이후에 도입되었습니다. 다음 코드를 다시 살펴보세요.

<?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();
?>

위 코드는 A를 출력하는데 B를 출력하고 싶습니다. 이것이 문제입니다. 이는 self와 CLASS의 한계이기도 합니다. 현재 메서드가 정의된 클래스에 따라 self:: 또는 CLASS를 사용하는 현재 클래스에 대한 정적 참조입니다. 따라서 이는 위 코드가 A를 출력하는 이유를 매우 잘 설명합니다. 하지만 B를 출력해야 한다면 어떻게 될까요? 다음과 같이 할 수 있습니다:

<?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();
?>

후기 정적 바인딩은 런타임에 처음 호출되는 클래스를 나타내는 새 키워드를 도입하여 제한을 우회하고 싶었습니다. 간단히 말해서, 이 키워드를 사용하면 위 예제에서 test()를 호출할 때 A 클래스 대신 B 클래스를 참조할 수 있습니다. 결국 새로운 키워드를 도입하지 않고 이미 예약된 정적 키워드를 사용하기로 결정되었습니다.

이것은 후기 정적 바인딩의 근원입니다. — 정적 키워드의 대체 사용법입니다. 기사 시작 부분의 예를 들어 다음과 같이 변경할 수 있습니다:

return new static(); // 改变这里,后期静态绑定

후기 정적 바인딩을 사용하면 PHP를 사용하여 23에서 디자인 패턴을 구현할 때 매우 편안함을 느낄 것입니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 도서:

객체 지향 PHP를 기반으로 방명록을 구현하는 단계에 대한 자세한 설명

PHP 단일 책임 원칙(SRP) 사용 사례 분석

위 내용은 PHP에서 지연된 정적 바인딩 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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