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->message는 Model 클래스를 상속하는 모델 클래스입니다. 여기서 create 메소드는
public static function create(array $attributes = []) { $model = new static($attributes); $model->save(); return $model; }
가 VendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php Line 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 = '纸牌屋弗兰克'; 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 사후 정적 바인딩의 정의 및 사용법에 대한 자세한 설명
PHP 지연 정적 바인딩이란 무엇입니까? 지연된 정적 바인딩 예제 코드에 대한 자세한 설명
위 내용은 Laravel의 후기 정적 바인딩에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!