这可能是一个非常直截了当的答案 - 但是我会赞赏一些建议。
我有一个小系统,我的所有对象都使用相同的load()和loadMultiple()方法。每个代码完全相同。非常简单,例如下面。
public static function load($id) {
// Instantiate the object
$object = new self($id);
return $object;
}
上面的示例代码显然不能进入接口,但是当我实例化对象时,它也不能进入抽象类(在loadMultiple方法中也是如此)。
最优雅的解决方案是什么?我目前正计划创建一个父类,如:
class Object_Model {
public function load() {
// Code here
}
public function loadMultiple() {
// Code here
}
}
class Object1 extends Object_Model {
}
class Object2 extends Object_Model {
}
但我相信一定有更好的方法。有吗?
答案 0 :(得分:0)
由于您当前的代码使用 static 方法,我相信拥有一个带有两个参数的函数会很好:要实例化的类的名称和id:
function load($class, $id) {
return new $class($id);
}
使用函数实现工厂是可以的。或者你在那里有更多的逻辑无法在函数中提取?
答案 1 :(得分:0)
如果你正在使用PHP 5.3,你确实可以使用父类和新的static
关键字来确定在其上调用静态函数的子类。
但是,我认为您最好只使用经过验证的new Object1($id);
方法,同时在__construct
方法中执行所有设置任务。您的代码将更容易阅读和维护。
您可能希望将加载多个示例抽象为单独的函数以加快该过程。
答案 2 :(得分:0)
我同意Ionut - 只需采用传统的工厂方法。
<?php
abstract class A
{
protected $id;
protected function __construct( $id )
{
$this->id = $id;
}
final public static function factory( $subclass, $id )
{
// Instantiate the object
if ( is_subclass_of( $subclass, __CLASS__ ) )
{
return new $subclass($id);
}
throw new Exception( "$subclass is not a valid class for this factory." );
}
}
class B extends A{}
class C extends A{}
class D{}
try {
$b = A::factory( 'B', 1 );
$c = A::factory( 'C', 2 );
$d = A::factory( 'D', 2 );
}
catch ( Exception $e )
{
echo "Oops! " . $e->getMessage();
}
您可以使用late static binding执行某些操作,但这只是PHP 5.3