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