Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:我应该传入并返回这些变量吗?_Php_Function_Oop_Refactoring_Abstraction - Fatal编程技术网

PHP:我应该传入并返回这些变量吗?

PHP:我应该传入并返回这些变量吗?,php,function,oop,refactoring,abstraction,Php,Function,Oop,Refactoring,Abstraction,我目前正致力于将我的WIP PHP应用程序转换为面向对象的体系结构,因为我发现对于我当前的项目来说,良好的OOP实践可能会使它变得更容易。在对代码进行重构时,我遇到了一个有点初级的问题,但遗憾的是,我不确定答案 我有一段代码(也称为“snippet”)——包含在第一个代码示例的“GenerateDBSetObjects()”函数中的代码——我觉得应该将其放入函数中(有点像子例程),如第一个示例中所述。出于两个原因,我想将其放入一个单独的功能块中: 简化主代码体 创建一个可以进行单元测试的函数 然

我目前正致力于将我的WIP PHP应用程序转换为面向对象的体系结构,因为我发现对于我当前的项目来说,良好的OOP实践可能会使它变得更容易。在对代码进行重构时,我遇到了一个有点初级的问题,但遗憾的是,我不确定答案

我有一段代码(也称为“snippet”)——包含在第一个代码示例的“GenerateDBSetObjects()”函数中的代码——我觉得应该将其放入函数中(有点像子例程),如第一个示例中所述。出于两个原因,我想将其放入一个单独的功能块中:

  • 简化主代码体
  • 创建一个可以进行单元测试的函数
  • 然而,这造成了一个问题。因为我的程序实际上有两个大范围变量,所以我需要同时返回两个值(这没什么大不了的,因为这是一个常见的主题:)。但我的问题是:既然我正在以面向对象的方式重新构造代码,有没有更有效的方法?可能是我没有考虑过的事情?还是最好只是传入并返回变量

    因为$NumDBSets和$DBSets[]基本上是全局范围,所以我不确定我应该在这里做什么

    index.php

    之后

    VS.

    以前


    全局范围和OOP不匹配

    您应该有一个对象保存此信息

    class DBSets {
      private $num;
      private $data;
    
      function __construct() {
        $this->num = 0;
        $this->data = [];
      }
    
      //setters and getters for accessing private properties
    }
    
    如果$num仅存储$data中的元素计数,则可以删除它并使用

    count($this->data);
    

    如果你决定采取面向对象的方法——考虑创建一个负责生成和存储<代码>数据库> 对象的类。 如果数据库集生成需要

    ConnectionManager
    类的对象,请将其标记为依赖项注入。
    DatabaseSet
    应在单独的文件中声明:
    DatabaseSet.php

    让我们调用我们的关键类
    DatabaseSetAdapter

    require_once("DatabaseSet.php");
    
    class DatabaseSetAdapter
    {
        private $config;
        private $logFile;
        private $NumDBSets = 0;
        private $DBSets = [];
        private $connManager;
        private $currDBSetNum;
    
        public function __construct($iniFilePath, ConnectionManager $manager)
        {
            $this->config = (parse_ini_file($iniFilePath, true)) 
            or die ("Config file: 'DBSearchCongif.ini' could not be read or found in the config folder. Please contact the system administrator");
    
            $this->logFile = $this->config['SystemVars']['LogFile'];
            $this->connManager = $manager;
            $this->currDBSetNum = $this->config['SystemVars']['DefaultDBSet'];
        }
    
        public function generateDBSetObjects()
        {
            //Create, Fill and Assign DatabaseSet Objects. Figure out the number of Database sets.
            $this->DBSets[] = new DatabaseSet;  //Push an empty DatabaseSet object into the list to occupy the '0' index!!!
            foreach($this->config['Databases'] as $connectInfoList){
    
                //Create a new DatabaseSet Object for this DB Set!!
                $newDBSetObject = new DatabaseSet;
                $newDBSetObject->ConnectionInfoList = $connectInfoList;
                $newDBSetObject->CalculateDBSetFields();
                $this->DBSets[] = $newDBSetObject;
                $this->NumDBSets++;
            }
        }
    
        public function getNumDBSets()   // a privileged method
        {
            return $this->NumDBSets;
        }    
    
    }
    
    // using of DatabaseSetAdapter:
    $dbsetAdapter = new DatabaseSetAdapter("config/DBSearchConfig.ini", new ConnectionManager);
    $dbsetAdapter->generateDBSetObjects();
    $numDbSets = $dbsetAdapter->getNumDBSets();
    ....
    

    你可能想看看Singleton是否保持了它的独特性,或者让一切都变得简单。谢谢Mihai,我的问题是:这合适吗?感觉DBSets类只是一个保存数据的datastorage类。我读过的并不是最好的选择(请记住我的经验有点有限)。我认为单例类是有意义的,但是将单例称为dbset以外的东西不是更好吗?在我的程序上下文中,已经存在一个数据库集(也称为DBSet)类。这些变量实际上只是为了跟踪这些对象和它们的数量。我会考虑这一点,因为这是一个有效的选择。名字只是作为一个例子。你应该想怎么命名就怎么命名。对象是用来存储数据和操作数据的方法。如果我理解正确,请告诉我:因此,在OO上下文中,我不应该在任何不在类定义内的局部或全局范围内声明变量。同样,我也不应该在main()(C++)或index.php(我的主代码是php)中创建和初始化变量。我理解正确吗?谢谢你的帮助!我花了不少时间阅读和思考,才明白你在说什么。我不知道你所说的依赖注入是什么意思(可能是因为我缺乏正式培训)。对于那些在依赖注入方面处于类似情况的人,这可能会有所帮助:@BrandonSnider,不客气!很高兴听到你们在PHPIn对我之前的评论的回复中了解到了依赖注入和OOP,对于那些关注依赖注入的人,或者像我一样在这方面苦苦挣扎的人来说:熟悉类设计的坚实原则和打包原则“OOD原则”会有很大帮助这似乎是一个很好的资源。这也不是一个糟糕的资源,但它更具体地针对C#/.net开发人员:
    count($this->data);
    
    require_once("DatabaseSet.php");
    
    class DatabaseSetAdapter
    {
        private $config;
        private $logFile;
        private $NumDBSets = 0;
        private $DBSets = [];
        private $connManager;
        private $currDBSetNum;
    
        public function __construct($iniFilePath, ConnectionManager $manager)
        {
            $this->config = (parse_ini_file($iniFilePath, true)) 
            or die ("Config file: 'DBSearchCongif.ini' could not be read or found in the config folder. Please contact the system administrator");
    
            $this->logFile = $this->config['SystemVars']['LogFile'];
            $this->connManager = $manager;
            $this->currDBSetNum = $this->config['SystemVars']['DefaultDBSet'];
        }
    
        public function generateDBSetObjects()
        {
            //Create, Fill and Assign DatabaseSet Objects. Figure out the number of Database sets.
            $this->DBSets[] = new DatabaseSet;  //Push an empty DatabaseSet object into the list to occupy the '0' index!!!
            foreach($this->config['Databases'] as $connectInfoList){
    
                //Create a new DatabaseSet Object for this DB Set!!
                $newDBSetObject = new DatabaseSet;
                $newDBSetObject->ConnectionInfoList = $connectInfoList;
                $newDBSetObject->CalculateDBSetFields();
                $this->DBSets[] = $newDBSetObject;
                $this->NumDBSets++;
            }
        }
    
        public function getNumDBSets()   // a privileged method
        {
            return $this->NumDBSets;
        }    
    
    }
    
    // using of DatabaseSetAdapter:
    $dbsetAdapter = new DatabaseSetAdapter("config/DBSearchConfig.ini", new ConnectionManager);
    $dbsetAdapter->generateDBSetObjects();
    $numDbSets = $dbsetAdapter->getNumDBSets();
    ....