我正在学习OOP和SOLID。我有一个'main'类,在从配置文件中读取变量后执行一些操作。这个“主要”类不是这个问题的焦点,但它可以被描述为一种结石。
我正在尝试拆分阅读配置文件并在'main'类中使用其设置的过程。
我正在考虑制作Config
课程。
interface ConfigInterface {
public function getFileContents();
}
class Config implements ConfigInterface {
protected $file_path;
protected $file_contents;
public function getFileContents() {
return $this->file_contents;
}
protected function readFileContents() {
$file_path = $this->file_path;
if ( is_file( $file_path ) ) {
$file_contents = include( $file_path );
return $file_contents;
} else {
die( 'Invalid config path specified ' . $file_path );
}
}
public function __construct( $file_path ) {
$this->file_path = realpath( $file_path );
$this->file_contents = $this->readFileContents();
}
}
这允许用户从公共方法中将所有设置作为单个数组获取。
但是,作为一个类,我不禁感觉这些设置被检索,因为数组应该被指定为具有公共访问器的对象的单独属性。因此,这些设置对于我的“主要”课程来说是独一无二的。在这种情况下,我正在考虑使用Config
类扩展泛型MainConfig
类,该类具有与我的“主”类相关的特定属性/访问器。
interface ConfigInterface {
// A config has a path, but doesn't need to have a public interface
// So don't know what goes in here now
}
class Config implements ConfigInterface {
private $file_contents;
public function __construct( $config_path ) {}
protected function readContents() {}
}
class MainConfig extends Config implments ConfigInterface {
private $main_settings_one;
private $main_settings_two;
private $main_settings_three;
public function getMainSettingOne() {};
public function getMainSettingTwo() {};
public function getMainSettingThree() {};
}
首先,这是正确的做法吗?此外,接口/基类是否需要定义函数?或者这些可以在以后定义吗?
其次,我是否需要ConfigHandler
/ ConfigReader
课程?如果我的'main'类需要设置才能工作,我可以将配置对象传递给'main'类并让函数执行此操作吗?或者它是另一个班级的独立责任?
我也在学习编码接口。我的“主要”课程只适用于特定的设置(这是一个结论?)所以,如果我有
class Main {
public function __construct( ConfigInterface $config ) { // coding to interface
$config->getMainSettingOne(); // specific functionality relating to a concretion?
}
}
$conf = new MainConfig( $path );
$main = new Main( $conf );
如果除MainConfig
之外的任何内容都通过,那么我的'main'类将无法正常初始化。我想到了一个'专业'界面,用于我的'主'课程。
interface MainConfigInterface {
public function getMainSettingOne();
public function getMainSettingTwo();
public function getMainSettingThree();
}
class Config { ... }
class MainConfig extends Config implments ConfigInterface {
private $main_settings_one;
private $main_settings_two;
private $main_settings_three;
public function getMainSettingOne() {};
public function getMainSettingTwo() {};
public function getMainSettingThree() {};
}
然后回到我的'主'课程,我仍然可以编码到界面?
class Main {
public function __construct( MainConfigInterface $config ) { // coding to interface
$config->getMainSettingOne();
}
$conf = new MainConfig( $path );
$main = new Main( $conf );
最后,这是在这方面编码接口的正确方法吗?