이 글은 주로 라라벨의 후기 정적 바인딩에 대한 간략한 논의를 소개하고 있습니다. 내용이 꽤 괜찮아서 참고용으로 올려드리겠습니다.
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에 정의된 메소드입니다. sub-table:
public function setTable($table) { $this->table = $table; return $this; }
$this->table이 적용되지 않은 것을 에러 로그에서 확인했는데, 실제로 create 메소드를 호출하기 전에 테이블 이름을 출력해 보니 예상했던 값이었습니다. 여기에서 create 메소드가 호출되었을 때 $this->table이 사용되지 않은 이유는 무엇입니까? 여기 $ this-& gt; Message는 Model 클래스를 상속하는 모델 클래스입니다. Create 메서드:
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
는 VendorLa BotheworksrcilluminatedatabaseEloquentModel.Php Line 557에 있습니다.
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 = '纸牌屋弗兰克'; 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로 변경하면 결과는 달라지며, 인쇄된 속성 이름은 각 클래스의 속성이 됩니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!
관련 권장 사항:
Laravel5에 대하여. 실행된 SQL 문을 인쇄하는 방법Laravel 5 프레임워크의 모델과 컨트롤러 및 뷰의 기본 프로세스에 대해 알아보기
위 내용은 Laravel의 후기 정적 바인딩 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!