面向对象的常用方法:接口,抽象或其他

时间:2009-07-22 16:55:27

标签: php oop

这可能是一个非常直截了当的答案 - 但是我会赞赏一些建议。

我有一个小系统,我的所有对象都使用相同的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 {
}

但我相信一定有更好的方法。有吗?

3 个答案:

答案 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