>PHP 프레임워크 >Laravel >Laravel의 후기 정적 바인딩

Laravel의 후기 정적 바인딩

藏色散人
藏色散人앞으로
2019-10-23 13:43:092285검색

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에서 정의한 메소드와 같습니다. the sub-table: # 🎜🎜#

public function setTable($table)
{
    $this->table = $table;
    return $this;
}

에러 로그를 보면 $this->table이 적용되지 않는 것을 확인했지만 실제로 create 메소드를 호출하기 전에 테이블 이름을 출력하면 $this->가 여기서 호출되는 이유는 무엇입니까? 테이블이 재설정되지 않았습니까?

여기서 $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 메소드도 호출합니다. Laravel의 후기 정적 바인딩

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 메소드를 호출한 후에는 name 속성이 변경되지 않았습니다. . 이 글에서 언급한 라바렐에서 마주한 장면이 바로 이것이다. (여기서 주석을 켜면 인쇄된 이름이 다시 작성된 값입니다)

추상 클래스 A를 일반 클래스로 변경하고 인스턴스화를 위해 new static을 new self로 변경하면 결과는 인쇄된 속성 이름은 모두 해당 클래스의 속성입니다.

더 많은 Laravel 관련 기술 기사를 보려면

Laravel 프레임워크 시작 튜토리얼

컬럼을 방문하여 알아보세요!

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

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제