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;
    }