Php 延迟加载和依赖注入模式中的冗余getter和setter
目前,我正在PHP应用程序中实现延迟初始化和依赖项注入模式,并面临以下问题: 每个类都有一组getter和setter方法,提供外部类的对象。有没有一种优雅的方法可以消除父类或某种工厂的这种“冗余” 编辑:不丧失可测试性的优势;-) EDIT2:下面是我使用的getter和setter方法的示例:Php 延迟加载和依赖注入模式中的冗余getter和setter,php,dependency-injection,coding-style,lazy-loading,traits,Php,Dependency Injection,Coding Style,Lazy Loading,Traits,目前,我正在PHP应用程序中实现延迟初始化和依赖项注入模式,并面临以下问题: 每个类都有一组getter和setter方法,提供外部类的对象。有没有一种优雅的方法可以消除父类或某种工厂的这种“冗余” 编辑:不丧失可测试性的优势;-) EDIT2:下面是我使用的getter和setter方法的示例: function getSql() { if (is_object($this->sql) === FALSE) { $registry = \Registry::get
function getSql() {
if (is_object($this->sql) === FALSE) {
$registry = \Registry::getInstance();
$factories = $registry->get('factories');
$database = $factories['databaseSql'];
$this->sql = $database->getSql();
}
return $this->sql;
}
function setSql($sqlObject) {
// ... some checks
$this->sql = $sqlObject;
}
EDIT3我遵循了使用traits的想法,因此这里有一个示例解决方案,在类“注册”中使用trait:
用法
你知道PHP语言的OOP优势吗 可能是一些面向方面的编程。比如说
因为您没有提供任何代码,所以有这么多的链接。我添加了一个示例,将通读您提到的链接。我知道继承、神奇的getter和setter。当另一个类需要这样的对象时,这个getter/setter对有一个特性可以使用吗?
trait Registration {
private $registration = null;
public function getRegistration() {
$registry = \Registry::getInstance();
$factories = $registry->get('factories');
if (is_object($this->registration) === TRUE) {
// get obect if instance already exists
$registration = $this->registration;
} else if (isset($factories['registration']) === TRUE) {
// get object using the matching factory
$registrationFactory = $factories['registration'];
$registration = $registrationFactory->getRegistration();
} else if (class_exists('\engine\classes\Registration') === TRUE) {
// get object using the default object class when no specific factory is defined
$registration = new \engine\classes\Registration();
} else {
throw new \Exception('error getting an instance of Registration');
}
$this->registration = $registration;
return $registration;
}
public function setRegistration($object) {
if (is_object($object) === FALSE)
throw new \Exception('invalid registration object');
$this->registration = $object;
}
}
class Foo {
use Registration;
public function bar() {
$reg = $this->getRegistration();
// ... use instance of Registration
}
}