4
은 내가 만들 필요가 각 도메인 객체의 현재의 기본 구조를 가지고 냄새 제거하는 방법 무슨 "늦은 정적 바인딩"PHP 세계에서 의미합니다.리팩토링은 정적 방법 코드
누구나이 코드를 리팩토링하는 방법에 대한 제안을 가지고 있으므로 내가 만든 모든 도메인 객체에서 동일한 세 가지 기능을 다시 선언 할 필요가 없다는 것이 궁금합니다. 이 방법에 대해
은 내가 만들 필요가 각 도메인 객체의 현재의 기본 구조를 가지고 냄새 제거하는 방법 무슨 "늦은 정적 바인딩"PHP 세계에서 의미합니다.리팩토링은 정적 방법 코드
누구나이 코드를 리팩토링하는 방법에 대한 제안을 가지고 있으므로 내가 만든 모든 도메인 객체에서 동일한 세 가지 기능을 다시 선언 할 필요가 없다는 것이 궁금합니다. 이 방법에 대해
:
불행하게도<?php
abstract class Model_Abstract
{
protected $_gatewayName = null;
protected $_gateway = null;
protected function _init()
{
$this->_gateway = new $this->_gatewayName();
}
protected function __construct($row = null)
{
$this->_init();
if ($row) {
$this->_data = $row;
}
}
public static function getAbstract($class, $param)
{
$model = new $class();
if($param instanceof Zend_Db_Table_Row_Abstract)
{
$row = $param;
}
elseif(is_numeric($param))
{
$row = $model->_gateway->find($param)->current();
}
return new $class($row);
}
public static function getAbstractCollection($class, $param = null)
{
$model = new $class();
if($param instanceof Zend_Db_Table_Rowset_Abstract)
{
$rowset = $param;
}
elseif($param === null)
{
$rowset = $model->_gateway->fetchAll();
}
$array = array();
foreach ($rowset as $row)
{
$array[] = new $class($row);
}
return $array;
}
abstract public static function get($param);
abstract public static function getCollection($param = null);
}
class Model_Company extends Model_Abstract
{
protected $_gatewayName = 'Model_Table_Company';
public static function get($param) {
return self::getAbstract(__CLASS__, $param);
}
public static function getCollection($param = null) {
return self::getAbstractCollection(__CLASS__, $param);
}
}
class Model_Table_Company extends Zend_Db_Table_Abstract
{
protected $_name = 'company';
}
$model = Model_Company::get(1);
print "Got an object of type ".get_class($model)."\n";
$models = Model_Company::getCollection();
print "Got ".count($models)." objects of type ".get_class($models[0])."\n";
?>
가, 호출 기능을 쉽게하기 위해, 각 하위 클래스에서 get()
및 getCollection()
를 복제해야합니다. 다른 옵션은 부모 클래스에서 함수를 호출하는 것입니다 : 당신이 경로를 이동하려면
$model = Model_Abstract::getAbstract('Model_Company', 1);
print "Got an object of type ".get_class($model)."\n";
$models = Model_Abstract::getAbstractCollection('Model_Company');
print "Got ".count($models)." objects of type ".get_class($models[0])."\n";
당신은 기본 클래스와 함수 이름을 바꿀 수 있습니다. 그러나 요점은 입니다. 하나의 위치 또는 다른에서 자식 클래스의 이름을 지정해야합니다. 첫 번째 예에서와 같이 자식 클래스에서 상용구 함수를 만들거나 두 번째 예제에서와 같이 클래스의 이름을 문자열로 지정하십시오.
다시 한번 감사드립니다. 이전 답변에서 늦은 정적 바인딩을 언급했음을 알고 있습니다 만, 코드의 리팩터링을 시작하기 전까지는 그 제한이 의미하는 바를 깨닫게되었습니다. 첫 번째 솔루션을 보면 꽤 직관적 인 것처럼 보입니다. –
그리고 정적 속성과 메서드 중 상속이 가장 우아한 해결책이 될 것이지만 적어도 이제는 각 클래스의 get 및 getCollection 메서드가 많은 중복 코드와 달리 한 줄의 코드로 제한됩니다. –