문제

저는 Yii 애플리케이션을 개발해왔습니다.그리고 모델 동작에서 일종의 "추상적" 메서드를 선언하는 것이 가능한지 궁금합니다.나는 다음 선언을 직접 사용하는 것이 불가능하다는 것을 알고 있습니다.

abstract class FantasticBehavior extends CActiveRecordBehavior
{
    public abstract function doSomethingFantastic();
}

왜냐하면 이 클래스의 인스턴스가 필요하기 때문입니다.하지만 Yii가 완전한 마법이라는 것도 알고 있어요 :)

나는 단지 의무적인 순서로 동작으로부터 메서드를 다시 선언하기 위해 소유자 클래스를 만들고 싶습니다.물론, 동작 외에 인터페이스를 사용할 수도 있지만...

제가 말할 내용을 놓쳤거나 뭔가 명확하지 않은 경우 죄송합니다.그냥 물어보세요. 제가 무슨 뜻인지 설명하려고 노력하겠습니다.

혹시 이것에 대해 아는 사람 있나요?

미리 감사드립니다.

UPD

나는 Yii가 단지 PHP라는 것을 알고 있습니다.PHP를 확장하지 않습니다.그 위에는 상부구조가 있습니다.그리고 PHP는 다중 상속이 없기 때문에 다중 상속도 없습니다.

추상 키워드를 사용하여 동작 메서드를 선언할 수 없다는 것을 알고 있습니다.그래서 나는 "추상"이라는 단어를 따옴표로 묶었습니다.하지만 뭐든지.나는 행동이 어떻게 작동하는지 알고 있습니다.

내 질문은 어떻게든 모델을 의무화할 수 있는지(예:CActiveRecord의 하위) 일부 메소드를 선언합니다.

예를 들어, 내 목적에 따라 다음과 같이 할 수 있습니다.

class FantasticBehavior extends CActiveRecordBehavior
{
    public function doFantasticThings()
    {
        $this->owner->prepareForFantastic();
        // some code
    }
}

따라서 이 동작을 모델에 연결하고 doFantasticThings 메서드를 호출하면 이 메서드는 모델(소유자)에서 prepareForFantastic 메서드를 호출하려고 시도합니다.그리고 모델에 prepareForFantastic 메소드가 없으면 선언되지 않은 메소드가 호출되기 때문에 새로운 예외가 발생합니다.

내 질문에 직접 답변한 것 같습니다. :) 이에 대해 어떻게 생각하시나요?

UPD2

예, "추상" 메소드를 호출하지 않으면 그것이 선언되지 않았다는 사실을 알 수 없다는 것을 알고 있습니다.그것은 해석 가능한 언어의 "매력"입니다 :) 코드가 실행될 때까지 오류가 있는지 알 수 없습니다.하지만 가능한 한 빨리 이에 대해 알 수 있다면 정말 좋을 것입니다.예를 들어, 한 번 인스턴스 FantasticBehavior-클래스는 우리가 어떤 자식을 던질 수 있는 모델에 첨부됩니다. CException 모델에서 선언해야 하는 필수 메소드가 무엇인지 보여줍니다.이를 달성하기 위해 우리는 아래와 같은 것을 사용할 수 있습니다:

class FantasticBehavior extends CActiveRecordBehavior
{

    public function attach($owner)
    {

        if(!/*$owner has declared methods list this->abstractMethods*/)
        {
            throw new CAbstractMethodNotDecalared('....');
        }

        parent::attach($owner);     
    }

    public function abstractMethods()
    {
        return array('prepareForFantastic');
    }

}

메서드를 재정의해야 합니다. attach 수업에서 CBehavior "추상" 메서드가 선언되었는지 확인하세요.방법 abstractMethods 목록 "추상" 방법을 가져오는 데 사용됩니다.

있는지는 모르겠습니다 attachBehavior 이벤트가 존재합니다.그렇다면 재정의하는 대신 사용할 수 있습니다. attach 방법.

"추상" 메서드를 사용하는 동작을 위한 이 아이디어 기본 클래스를 사용합니다.

이것에 대해 어떻게 생각하세요?

어쩌면 미래에는 Yii를 확장하여 유명해지고 부자가 될 수도 있겠죠?:))

도움이 되었습니까?

해결책

이것은 조금 혼란 스러울 수 있습니다 ...

아니오, Yii의 행동 . 모든 행동의 Do는 __call(), __get() 환상 을 여러 상사의 을 제공하는 __set()의 영리한 재정의입니다. ( "Nofollow"> 이것은 좋은 기사입니다 ). 행동은 추상 클래스와 인터페이스와 같은 핵심 언어 기능에 대한 True "다중 상속"을 제공하지 않습니다. 따라서 해당 비헤이비어를 첨부하고 doSomethingFantastic() 클래스에 CActiveRecord를 추가하면 오류가 발생합니다.

can 은 다른 행동이 확장되는 추상적 인 행동을 선언합니다. 따라서 SuperFantasticBehavior를 확장하고 에서 FantasticBehavior를 구현 한 다른 doSomethingFantastic() 동작을 작성한 경우 괜찮을 것입니다. 그러나 doSomethingFantastic() 자체에서 CActiveRecord 메소드를 선언하도록 강요하지 않습니다.

조금 더 깊은 이해 : yii의 cComponent :: _ _ ) override는 메소드를 호출 할 때 먼저 해당 메소드가 있으면 먼저 해당 메소드가 있고 클래스 자체에서 메서드를 호출합니다.

행동은 처음에 시원한 것처럼 보입니다 (믹스). 그러나 때로는 php가 단일 클래스 상속 언어 및 유지가 간단합니다. ;)

업데이트 :

이 경우 코드를 실행하려고 할 때 "Class Class가"메소드를 구현해야 "오류가 발생할 때"Class Class가 메소드를 구현해야 함 "오류가 표시됩니다. 오류를 강조 표시합니다. 이것은 "컴파일"시간 오류가 더 많습니다 (PHP와 같은 해석 된 랭이 실제로 존재하지 않음).

대신 런타임에 "선언되지 않은 메소드"오류 (언급)가 표시됩니다. 그러나 그 방법이 실제로 부름 될 때까지는 그것을 보지 않을 것입니다. 즉, 추상적 인 정의와 같이 좋은 초기 경고를 얻지 못할 것입니다. 그 방법이 은 결코 이라고 부르지 않으면 오류가 발생하지 않을 것입니다. 라는 선언을 정말로 "의무"하지 않음을 의미하지는 않습니다.

죄송합니다. 초기 대답이 너무 기본적으로 기본적으로 시작되면 나는 단지 오해가 없었는지 확인하기를 원했습니다. 그것은 흥미로운 토론이며, 추상적 인 선언이 실제로하는 것에 대해 더 많이 생각하게 만들었습니다. 고마워, 행복한 코딩! :)

환호

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top