2012-12-12 3 views
1

CActiveRecord를 사용하는 기존 기능 코드를 수정하고 있습니다. 이제 스키마 드라이버가없는 sybase에 연결 중이므로 CActiveRecord 대신 CModel을 사용하여 다시 작성합니다. 내 일반적인 OOP 개념을 이해하지 못하는 것일까?정적 모델의 특성 설정 CModel

원본 : 더 이상 작동하지 ... 내가 기본 클래스 CActiveRecord 인 경우이 방법에만 작동 믿기 때문에 ::model()를 참조하지 MyModelController.php

MyModel::model()->scenario='case1'; 

.

/** 
* Returns the static model of the specified AR class. 
* @param string $className active record class name. 
* @return ClientProg the static model class 
*/ 
public static function model($className=__CLASS__) 
{ 
    return parent::model($className); 
} 

어떻게 기본 클래스 CActiveRecord 때 내가 한 것처럼 동일한 방식으로, CModel의 기반으로되어 이제 MyModel의 시나리오 속성을 설정할 수 있습니까?

+0

정적 모델을 잃어 버렸습니다. 정적 모델을 사용하는 대상은 무엇입니까? – Asgaroth

+0

* 정적 메서드 및 속성 * 예제 : $ something = MyModel :: staticMethod ($ args). 객체를 인스턴스화하지 않았 으면 아무 데나 메서드를 사용할 수 있습니다. 내가 뭘 놓친거야 정적 속성에 대한 __get, __set 생각하십니까? – MaxPowers

답변

0

model()을 호출하면 내부적으로 처음으로 인스턴스를 만든 다음이 캐싱 된 객체를 참조합니다.

정적 메소드가 인스턴스화 된 버전의 특성에 의존하지 않는다면 나중에 두통이 발생합니다.

정적 속성이 필요에 맞는지 확인하거나 시나리오를 정적 호출에 매개 변수로 전달하십시오.

어쨌든 static its evil이므로 가능하면 피해주십시오.

+0

사실, 당신이 맞습니다. CActiveRecord를 확장 할 때 MyModel :: model()은 부모 클래스에서 정적 메서드를 호출합니다.이 메서드는 메서드가 호출 된 확장 된 정적 클래스를 이미 사용하고 있으면 다시 사용합니다 (코드는 [여기] (https : // github.com/yiisoft/yii/blob/1.1.12/framework/db/ar/CActiveRecord.php#L381)). 나는 속성 시나리오를 넘어서 CModel을 확장 할 때 이와 동일한 정적 메소드를 구현하는 것이 유용 할 것이라고 생각한다. – MaxPowers

+0

그 논리는 AR에 특별히 적용됩니다. sybase에 대해 언급했습니다. 아마도 mongodb 제품군과 비슷한 접근 방식을 취할 수 있습니다. https://github.com/canni/YiiMongoDbSuite/blob/master/EMongoDocument.php#L1287 – Asgaroth

관련 문제