이 글에서는 PHPstorm이 클래스를 동적으로 반환할 수 있도록 하는 올바른 @return 주석을 소개합니다. 이는 특정 참조 값을 가지고 있으므로 도움이 될 수 있습니다.
장면은 다음과 같습니다. BaseModel(ActionRecord에서 상속됨)이 있고 다른 모든 모델은 여기에서 상속되며 메소드가 있습니다. 간단히 이 클래스의 코드를 붙여넣으세요.
class BaseModel extends ActiveRecord { protected $temp_model; public function getCacheModel() { return $this->temp_model; } }
이 메소드의 기능은 다음과 같습니다. 매개변수 확인을 수행할 때 인스턴스 개체가 데이터베이스에서 검색되어 캐시됩니다.
이때 문제가 생겼습니다. 이 개체를 꺼냈을 때 PHPstorm에는 프롬프트(메소드 프롬프트, 속성 프롬프트 등)가 없었습니다. 일반적인 상황에 따르면 앞에 @return 주석만 추가하면 됩니다. 방법의.
/** * @return static */ public function getCacheModel() { return $this->temp_model; }
정적의 의미에 대해서는 계속해서 깊이 공부해 보겠습니다.
static
이 값이 소비되는 클래스의 객체입니다.
상속되면 하위 클래스를 나타냅니다(후기 정적 바인딩 참조).
PHP 매뉴얼).
Google에서 번역한 일반적인 아이디어는 다음과 같습니다.
이 값을 소비하는 클래스의 객체는 상속된 경우 하위 클래스를 나타냅니다.
(PHP 매뉴얼의 후기 정적 바인딩 참조)
일반적인 의미는 이 메서드를 호출한 클래스가 반환된다는 것입니다. 메서드가 상위 클래스의 하위 클래스에 의해 호출되면 하위 클래스가 반환됩니다.
유사한 것이 2개 있습니다
self
이 유형이 사용된 클래스의 객체입니다. 상속된 경우에도 원래 정의된 클래스를 나타냅니다.
$this
이 정확한 객체 인스턴스는 일반적으로 유창한 인터페이스입니다.
직역하면 다음과 같습니다.
self: 이 유형의 클래스를 사용하는 개체로, 상속받는 경우 원래 정의한 클래스를 계속 나타냅니다.
일반적인 아이디어는 정적과 비슷하지만 하위 클래스에서 상위 클래스 메서드를 호출하면 여전히 상위 클래스를 반환한다는 것입니다.
$this: 이 정확한 객체 인스턴스는 일반적으로 부드러운 인터페이스를 나타내는 데 사용됩니다.
셀프와 거의 똑같습니다.
이 시점에서 내 문제는 여전히 해결되지 않았습니다. @return 값을 무엇으로 변경하더라도 BaseModel은 여전히 반환됩니다. 이 getCacheModel() 메서드에서 self::className()을 인쇄하면 나타나는 현상입니다. 서브클래스 이름입니다.
그래서 계속해서 컨트롤러에서 호출해 봤습니다.
public function actionCommitReward() { $model=$this->goCheck(new TakeRewards(['scenario'=>'commit_reward'])); //获取实际要修改的数据 $reward = $model->getCacheModel(); }
이때 주의할 점은 없는 것 같습니다. $model은-입니다. >goCheck() 호출이 획득되면 goCheck 메소드를 살펴보겠습니다.
//验证参数是否合法 public function goCheck($model, $dada = '') { $data = $this->postData;//post传入的数据 if ($model->load($data, '') && $model->validate())//数据效验
return $model;
else (new PublicFunction())->returnWayTip('1001', PublicFunction::getModelError($model));//这里理解成抛异常 }
여기에 모델(객체 유형)이 전달되므로 PHPstorm은 우리의 정보를 알 수 없습니다. 특정 클래스가 전달되고 주석을 추가한 후:
/** * @param object $model * @param string $dada * @return model1|model2 */
이후 문제는 "거의 해결되지 않음"입니다. 단지 테이블이 추가될 때마다 테이블에 해당하는 클래스 이름을 @return에 추가해야 하고, 존재해서는 안 되는 클래스의 속성을 묻는 메시지가 표시된다는 것뿐입니다.
여기서는 왜 static을 사용할 수 없나요? 여기서는 $this가 호출되므로 컨트롤러 클래스를 반환하는 것은 아무 소용이 없습니다. 이는 나중에 $model->getCacheModel() 메서드를 사용할 때 사용해야 하는 클래스를 제대로 식별할 방법이 없다는 사실로 이어집니다. 반환됩니다(반환되는 클래스는 @return 주석이 무엇인지 goCheck에 따라 다릅니다).
물론 댓글을 작성할 필요는 없습니다. 그러면 모든 프롬프트가 사라진다는 것을 알게 될 것입니다.
이번에 댓글의 중요성을 정말 깨달았습니다. . . PHPstorm이 프롬프트를 표시하는 이유는 모두가 PHPDoc 사양에 따라 댓글을 작성했기 때문인 것으로 밝혀졌습니다!
마지막으로, GoChekc 메소드를 BaseModel에 넣어보면 어떨까요?라고 묻는 학생들도 있습니다. 예, 실제로 표준 접근 방식은 이렇습니다. 하지만 컨트롤러의 $this->postData에 Yii::$app->request->post()를 할당했기 때문에 (편리하긴 하지만) Diudiu), 토큰을 ID로 변경하는 일부 작업을 수동으로 할당했기 때문에 postData를 모델에서 가져올 수 없기 때문에 방법이 없습니다. 물론 이를 옮겨야 하지만 매번 $this-> postData, 그것은 의견의 문제입니다.
그러나 이 두 가지 방법은 표준화되어 있지 않습니다. $this->postData = Yii::$app->request->post(); 전역 변수를 지역 변수로 변환하는 표준화된 접근 방식입니다. 게시 데이터에 값을 할당하려면 Yii::$app->request->post($name,$dafaultValue)를 사용해야 합니다.
마지막으로 혼자 쓰는 것이 아니기 때문에 급격한 변화를 줄 수 있는 방법은 없고, 최대한 최적화할 수밖에 없습니다.
추천 관련 기사:
php 재귀 함수 반환은 원하는 값을 올바르게 반환하지 못할 수 있습니다.
PHP의 메서드는 참조 유형을 반환하고, php는 참조 유형을 반환합니다
위 내용은 PHPstorm이 동적으로 클래스를 반환할 수 있도록 @return에 올바르게 주석을 추가하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!