찾다

 >  Q&A  >  본문

매직 메소드 __callStatic의 Trait 함수에 대한 별칭 정의

<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>
P粉226642568P粉226642568488일 전453

모든 응답(1)나는 대답할 것이다

  • P粉439804514

    P粉4398045142023-08-01 10:51:41

    Trait 메소드는 "이름 변경"이 가능합니다: (실제로는 별칭)

    으아아아

    참고

    간단한 예:

    으아아아

    회신하다
    0
  • 취소회신하다