【问题标题】:pass global variables as parameter in a function or initialise it in constructor [closed]将全局变量作为参数传递给函数或在构造函数中初始化它[关闭]
【发布时间】:2020-10-10 20:45:35
【问题描述】:

假设我们有一个 FruitFactory 类,它根据可以全局访问的查询参数 $type 创建水果。

以下哪种方法更好? (或者如果有其他更好的方法,请告诉我)。

在函数中将全局变量作为参数传递是否有意义? (就像第一种方法一样)

还是直接调用函数,让它负责全局变量type

class FruitFactory
{

    public function create($type)
    {
        if($type == 'Apple')
        {
            return new Apple();
        }
    }
}

$fruit = new FruitFactory();
$type = $_GET['type'];
$result = $fruit->create($type);

或者

class FruitFactory
{
   protected $type;
   public function __construct()
    {
         $this->type = $_GET['type'];
    }

    public function create()
    {
        if($this->type == 'Apple')
        {
            return new Apple();
        }
    }
}

$fruit = new FruitFactory();

$result = $fruit->create();

【问题讨论】:

  • 哪个工厂可以自动化测试?
  • 我猜是第一种方法,因为 $type 在 create 方法中作为参数传递(如果我错了,请纠正我)
  • 第二个版本很糟糕,因为它与网络服务器查询上下文中的用户输入紧密耦合。您的第一个版本更加可靠(除了 create 函数应该总是返回一些东西或抛出错误之外)。
  • 确实 :) 谨慎处理基于意见的问题。
  • 如果有第三个版本,我将构造函数中的全局变量作为参数传递怎么办。我想我仍然可以测试它,因为我什至无法在构造函数中传递该参数的情况下实例化一个对象。

标签: php oop


【解决方案1】:

第一个示例是更好的实现,原因有很多。您的问题的一个具体问题是关于灵活性。第一个示例只需要一个类型值(可以来自任何地方,包括全局状态)。而第二个示例需要一个特定的全局状态值,这使得它的使用灵活性大大降低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多