我有點不知所措,管理一個複雜的PHP的應用程序。在過去,我使用靜態方法來處理'utils'類,但是我正在編寫一個新的應用程序,並且我想盡可能以最高標準進行編碼,所以我儘可能地避免使用它們。保持可測試性等對象工廠
我已經看過依賴注入,但我打算創建一個幫助類的「庫」(所以說),我可以放入和退出項目沒有太多麻煩。我的問題是,因爲我可能會有五六個,我真的不想設置用戶需要將所有這些對象傳入的構造。
我的研究帶來了我的工廠 - 和我創建這樣的野獸,但我真的不知道這是去了解事情的正確方法。它會有點像這樣...
class Create {
private static $validation = null;
private static $helper = null;
private static $html = null;
private static $form = null;
public static $user = null;
public static $db = null;
// --------------------------------------------------------------
// Initialize
// --------------------------------------------------------------
public static function load($object, $options, $dependencies = array('html', 'helper', 'db', 'user')) {
// Create specified object (without constructor)
// PHP version < 5.4
$$object = self::createInstanceWithoutConstructor($object);
// Inject specified options into new object
foreach($dependencies as $dependency):
if(is_null(self::$$dependency)): self::$$dependency = new $dependency; endif;
$$object->$dependency = self::$$dependency;
endforeach;
// Now call the constructor
// PHP version < 5.4
if(method_exists($$object, '__construct')):
$$object->__construct($options);
endif;
return $$object;
}
// --------------------------------------------------------------
// Create Instance of Object Without Calling it's Constructor
// --------------------------------------------------------------
// Workaround for PHP version < 5.4
// This will be updated to use
// ReflectionClass::newInstanceWithoutConstructor
// when 5.4 is more freely supported
// --------------------------------------------------------------
private static function createInstanceWithoutConstructor($class) {
$reflector = new ReflectionClass($class);
$properties = $reflector->getProperties();
$defaults = $reflector->getDefaultProperties();
$serealized = "O:" . strlen($class) . ":\"$class\":".count($properties) .':{';
foreach ($properties as $property){
$name = $property->getName();
if($property->isProtected()){
$name = chr(0) . '*' .chr(0) .$name;
} elseif($property->isPrivate()){
$name = chr(0) . $class. chr(0).$name;
}
$serealized .= serialize($name);
if(array_key_exists($property->getName(),$defaults)){
$serealized .= serialize($defaults[$property->getName()]);
} else {
$serealized .= serialize(null);
}
}
$serealized .="}";
return unserialize($serealized);
}
// --------------------------------------------------------------
// Create User
// --------------------------------------------------------------
public static function User($options = array()) {
$user = self::load(__FUNCTION__, $options);
return $user;
}
// --------------------------------------------------------------
// Create Page
// --------------------------------------------------------------
public static function Page($options = array()) {
$page = self::load(__FUNCTION__, $options);
return $page;
}
// --------------------------------------------------------------
// Create Form
// --------------------------------------------------------------
public static function Form($name, $method = 'POST', $action = null, $attributes = array()) {
// Check to see if form was submitted
// If so, get form object, otherwise create new form object
if(isset($_POST[$name])):
$form = unserialize($_SESSION['formObj']);
$form->errors = array();
$form->rule = $form->rule;
$form->labels = $form->labels;
$form->errors = $form->errors;
else:
$form = self::load(__FUNCTION__, array(), array('html', 'validation'));
$form->name = $name;
endif;
// Open the form
$form->open($method, $action, $attributes);
return $form;
}
}
所以它擁有用於創建各種物體獨立的功能,有傳遞,除非依賴性明確設置默認的選擇。現在
,我真的不知道,如果這是一個很好的辦法,從更多的研究,我收集它可能是一個更好的主意,有一個工廠爲每個負責該類創建對象類。這是更正確的方法嗎?如果是這樣,那麼這些工廠方法(不知道這是正確的術語嗎?)只是靜態的,可以在任何地方調用,或者他們只是創建新對象然後傳遞它們的普通方法?這是否也需要擴展一個包含已創建對象的「工廠」類?
希望一切都有道理,任何和所有的幫助將不勝感激。
你的,
混淆N00b。
只是一個小提示:名稱爲動詞的類要麼命名不正確,要麼是 - 經常 - 嚴重封裝。動作(動詞)不是對象(名詞)。 – str
如果你的課程有太多的依賴關係,那麼這是一個明確的標誌,你的班級有太多的責任。而不是增加一些魔法,而應該嘗試修復這些類。另外,這個'$$對象'的意義是什麼?爲什麼你不能把它稱爲'$ instance',因爲它是一個局部變量,它的名字在函數外面沒有任何作用。 –
我不認爲我的課程有太多的責任,這是我希望我的'幫手'課程可以在整個應用程序中輕鬆使用。我只是在試圖避免靜態類時發現難以允許。 至於$ object - $ instance可能會更有意義tbh。感謝指針。 – 0Neji