매직 메소드 __callStatic의 Trait 함수에 대한 별칭 정의
P粉226642568
2023-07-31 11:46:23
<p>빌더의 새 인스턴스를 생성하고 존재하는 경우 호출된 함수를 실행하기 위해 __callStatic 메서드를 사용하는 Queryable 특성이 있습니다. 쿼리 연결을 위한 빌더를 반환합니다(Eloquent와 유사). <br /><br />이제 find() 함수가 필요한 인터페이스를 구현하려고 하는데 find() 함수가 Queryable 특성의 phpDoc에 선언되어 있습니다(@method static static find (mixed $primaryKeyValue) ) 충돌이 발생합니다. </p><p><code></code></p>
<인용문>
<p>Queryable의 find(primaryKeyValue:mixed) 선언은 StorageInterface->find(primaryKeyValue:mixed)와 호환되어야 하며 인터페이스 메소드를 생성할 수 없습니다. </p>
</인용문>
<p>이 충돌을 해결하기 위해 특성 별칭과 유사한 방법(Queryable { Queryable::find as queryFind; } 사용)을 사용하려고 시도했지만...</p>
<인용문>
<p>컴파일 오류: appFrameworkTraitsQueryable::find에 대한 별칭이 정의되었지만 메소드가 존재하지 않습니다.</p>
</인용문>
<p>해결책을 찾을 수 없는 것 같습니다. 누구든지 도와주실 수 있나요? :) (나는 이것이 마법의 방법이기 때문에 클래스에 대한 일종의 존재 확인과 관련이 있다고 생각하지만, 그것을 고치는 방법도 모르겠습니다..) </p>
<pre class="brush:php;toolbar:false;"><?php
네임스페이스 appFrameworkTraits;
appFrameworkDatabaseBuilder를 사용하세요.
appFrameworkDatabasePaginator를 사용하세요.
/*** @method static int count()
* @method static static|array<static> 첫 번째(int $amount = 1)
* @method static static|array<static> last(int $amount = 1)
* @method 정적 문자열 getQuery()
* @method 정적 문자열 getRawQuery()
* @method 정적 문자열 getPrimaryKey()
* @method static static find(혼합 $primaryKeyValue)
* @method 정적 배열<static> 모두()
* @method 정적 배열<static> 얻다()
* @method static 페이지네이터 paginate()
* @method 정적 빌더 테이블(string $tableName)
* @method static Builder PrimaryKey(string $primaryKey)
* @method static Builder perPage(int $perPageAmount)
* @method 정적 빌더 여기서(string $column, 혼합 $operatorOrValue = null, 혼합 $value = null)
* @method static Builder whereIn(string $column, array $search)
* @method 정적 빌더 whereNotNull(string $column)
* @method static Builder select(...$columns)
* @method static Builder with(string $relation, Closure $closure)
* @method static Builder orderBy(string $column, string $direction = 'desc')
* @method 정적 빌더 제한(int $amount)
* @method 정적 빌더 오프셋(int $amount)*/
특성 쿼리 가능
{
공개 정적 함수 __callStatic(문자열 $name, 배열 $arguments)
{
$functions = get_class_methods(Builder::class);
if (in_array($name, $functions)) {
$builder = new Builder(정적::클래스);
return $builder->$name(...$arguments);
}
$selfFunctions = get_class_methods($calledClass = static::class);
if (!in_array($name, $selfFunctions)) {
throw new BadMethodCallException("정적 메서드 '{$name}'이(가) {$calledClass}에 존재하지 않습니다.");
}
return static::$name(...$arguments);
}
}
BaseModel 클래스는 stdClass를 확장하여 QueryableInterface, StorableInterface를 구현합니다.
{
쿼리 가능 {
쿼리 가능::queryFind로 찾기;
}
공용 함수 찾기(혼합 $primaryKeyValue): 정적
{
return self::queryFind($primaryKeyValue);
}
}
<?php
네임스페이스 appStorageMethods;
인터페이스 저장 가능 인터페이스
{
함수 getObject(혼합 $primaryKeyValue): 정적;
함수 찾기(혼합 $primaryKeyValue): 정적;
함수 저장(): 정적;
}</pre>
<p><br /></p>
Trait 메소드는 "이름 변경"이 가능합니다: (실제로는 별칭)
으아아아참고
간단한 예:
으아아아