Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 面向对象的常用方法:接口、抽象或其他_Php_Oop - Fatal编程技术网

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

Php 面向对象的常用方法:接口、抽象或其他,php,oop,Php,Oop,这可能是一个非常直截了当的答案——但如果您能提供一些建议,我们将不胜感激 我有一个小系统,其中所有对象都使用相同的load()和loadMultiple()方法。每种语言中的代码完全相同。非常简单,下面的例子 public static function load($id) { // Instantiate the object $object = new self($id); return $object; } 上面的示例代码显然不能放在接口中,但也不能放在抽象类中,

这可能是一个非常直截了当的答案——但如果您能提供一些建议,我们将不胜感激

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

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

由于您当前的代码使用的是静态方法,因此我认为最好有一个包含两个参数的函数:要实例化的类的名称和id:

function load($class, $id) {
    return new $class($id);
}

使用函数实现工厂是可以的。或者,您在其中执行的逻辑是否有更多无法在函数中提取的逻辑?

如果您使用的是PHP5.3,您确实可以使用父类和新的
static
关键字来确定调用了静态函数的子类

然而,我认为您最好只使用久经考验的
newobject1($id)\u构造中执行所有设置任务时使用code>方法。您的代码将更易于阅读和维护


加载多个示例您可能希望将其抽象为一个单独的函数以加快处理过程。

我同意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();
}

谢谢你,彼得。后期静态绑定看起来很完美。但我不认为我们的服务器会支持它。我理解你和Ionut所说的,但当我接近优雅5.3的时候,这似乎是一个倒退。对不起,D库西尼奥-彼得对lsb的解释好了一点,所以我给了他答案