Laravel의 후기 정적 바인딩에 대한 간략한 분석

*文
풀어 주다: 2023-03-19 08:18:01
원래의
1553명이 탐색했습니다.

이 글은 주로 라라벨의 후기 정적 바인딩에 대한 간략한 논의를 소개하고, 참고용으로 모든 분들과 공유합니다. 그것이 모두에게 도움이 되기를 바랍니다.

PHP의 새로운 정적 지연 정적 바인딩 또는 후기 정적 바인딩과 관련하여 Laravel에서 사용 문제가 발생했습니다. 다음과 같이 Laravel에서 새로운 데이터를 추가하기 위해 Model을 호출할 때 먼저 Model에 하위 테이블을 얻기 위한 메소드를 추가합니다:

protected function addToMessage($msgType, $userID, $commentID, $replyCommentID, $replyUserID, $gameID)
{
  if (!$userID) {
    return false;
  }
 
  $table = 't_message_' . hashID($userID, 100);
  $this->message->setTable($table)->create([
    'msg_type'     => $msgType,
    'user_id'     => $userID,
    'comment_id'    => $commentID,
    'reply_comment_id' => $replyCommentID,
    'reply_user_id'  => $replyUserID,
    'game_id'     => $gameID,
    'is_read'     => 0,
    'created_at'    => date('Y-m-d H:i:s'),
  ]);
  return true;
}
로그인 후 복사

여기서 setTable 메소드는 하위 테이블을 얻기 위해 Model에 정의된 메소드입니다:

public function setTable($table)
{
  $this->table = $table;
  return $this;
}
로그인 후 복사

오류 로그에서 $this->table이 적용되지 않는 것으로 나타났는데 실제로 create 메소드를 호출하기 전에 테이블 이름을 인쇄하면 예상되는 값인 $this->table이 나옵니다. 여기서 create 메소드가 호출되면 재설정되지 않습니까?

여기서 $this->message는 Model 클래스를 상속하는 모델 클래스입니다. 여기서 create 메소드는

public static function create(array $attributes = [])
{
  $model = new static($attributes);
 
  $model->save();
 
  return $model;
}
로그인 후 복사

가 VendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php 557행에 있습니다.

Laravel 프레임워크의 Model 클래스는 추상 유형이기 때문입니다. , PHP의 추상 클래스 새로운 정적 후기 정적 바인딩을 사용하여 인스턴스화할 수 있으며 create 메소드의 $model = new static($attributes)이 실제로 다시 인스턴스화되어 반환되며 호출자 Model 클래스는 테이블 속성을 정의하지 않습니다. , 따라서 현재 $ this->table에는 값이 없습니다.

해결 방법은 그림과 같이 저장 방법을 사용하는 것입니다. 실제로 create 메소드는 save 메소드도 호출합니다.

Experiment

추상 클래스 A에는 지연된 정적 바인딩을 통해 인스턴스화되고 반환되는 create 메서드가 있습니다. 클래스 B는 A를 상속하고 상위 클래스의 name 속성은 테스트 메서드에서 수정됩니다.

<?php
 
abstract class A
{
  protected $name = "tanteng";
 
  public static function create()
  {
    return new static();
  }
}
 
class B extends A
{
  //protected $name = &#39;纸牌屋弗兰克&#39;;
 
  public function test()
  {
    $this->name = "Tony Tan";
    return $this;
  }
}
 
$obj1 = (new B)->test();
$obj2 = (new B)->test()->create();
var_dump($obj1);
var_dump($obj2);
로그인 후 복사

결과에 따르면 $obj1과 $obj2의 인스턴스는 모두 B의 인스턴스입니다. 테스트 메서드를 호출하여 속성 이름이 변경되었지만 create 메서드를 호출한 후에는 이름 속성이 변경되지 않았습니다. 이 글에서 언급한 라바렐에서 마주한 장면이 바로 이것이다. (여기서 주석을 켜면 인쇄된 이름이 다시 쓰여진 값이 됩니다)

추상 클래스 A를 일반 클래스로 변경하고, 인스턴스화를 위해 new static을 new self로 변경하면 결과는 달라지며, 인쇄된 속성 이름은 각 클래스의 속성이 됩니다.

관련 권장사항:

Laravel의 미들웨어 구현 방법 살펴보기

분할 라우팅 파일의 Laravel 최적화

laravel 작성 APP 인터페이스(API)

위 내용은 Laravel의 후기 정적 바인딩에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿