Php 如何在不破坏或重写许多其他类的方法签名的情况下,将值引入内部方法的范围?
我有一些这样的代码:Php 如何在不破坏或重写许多其他类的方法签名的情况下,将值引入内部方法的范围?,php,dependency-injection,dependency-management,Php,Dependency Injection,Dependency Management,我有一些这样的代码: abstract class FieldsetManager { function populateFieldset(Fieldset $fieldset) {} } class DataFieldsetManager extends FieldsetManager { function populateFieldset(Fieldset $fieldset) { /** * The problem is
abstract class FieldsetManager
{
function populateFieldset(Fieldset $fieldset)
{}
}
class DataFieldsetManager extends FieldsetManager
{
function populateFieldset(Fieldset $fieldset)
{
/**
* The problem is with value of $ledgerID
* How do I get $ledgerID into this scope?
*/
$value = MySqlConnector::getMySql()
->query("select value from table where id = " . $ledgerID)
->getArray();
$fieldset->get('data')->setValueOptions($value);
}
}
class FormManager extends GenericRepository
{
function populateForm(Form $form)
{
(new MotorFieldsetManager())->populateFieldset($form->get("motor"));
(new DriveFieldsetManager())->populateFieldset($form->get("drive"));
(new DataFieldsetManager())->populateFieldset($form->get("data"));
(new SubmitFieldsetManager())->populateFieldset($form->get("submit"));
}
}
/*
* This code is located in my Controller:
*/
$ledgerId = $_SESSION['ledger_id'];
$form = new \Zend\Form\Form();
$formManager = new FormManager();
$formManager->populateForm($form);
注意DataFieldsetManager::populateFieldset()
中的$ledgerId
值。$ledgerId
的值最初存储在会话变量中,并在应用程序引导期间检索(即存储为全局变量)
我的选择似乎是
DataFieldsetManager::populateFieldset()中再次直接从会话检索值
FormManager
方法签名,以允许注入$ledgerId
(这可以通过构造()或setter方法完成,也可以通过将$ledgerId传递给FormManager::populateForm()
,然后传递给DataFieldsetManager::populateFieldset()
。但是,这破坏了代码的一致性,即MotorFieldsetManager::populateFieldset()
方法签名将不受影响,并且不带参数,而DataFieldsetManager::populateFieldset($ledgerId)
签名现在将包含一个额外的参数您将如何处理此问题?使用全局变量可以解决此问题
$variable_name;
public function something()
{
Global $variable_name;
if ($this->link === null)
$this->link = something::something();
return $this->link;
}