【问题标题】:Method overloading and class inheritance方法重载和类继承
【发布时间】:2011-08-16 07:47:01
【问题描述】:

我无法理解代码工作?我不知道为什么?有可能吗?

我希望始终调用默认类和方法。但实际上取决于给定的参数。我想从那个特定的客户那里加载方法?

<?php
#System Defaults
namespace DefaultNameSpace;

class defaultClass{

    private $property;

    public function __construct($cusotmer)
    {
        if (isset($cusotmer)){
            $namespace = '\Customer' . $cusotmer .'Namespace\defaultClass';
            # create new dynamic object
            return new $namespace();
        } else {
            return $this;
        }

    }
    public function printInvoice(){
        echo 'Default Print';
    }
    public function createInvoice($invoice){}
}

#Customer One defaults
namespace CustomerOneNamespace;

class defaultClass extends \DefaultNameSpace\defaultClass {

    private $property;

    public function __construct()
    {
        return $this;
    }
    public function printInvoice(){
        echo 'Customer One';
    }
    public function createInvoice ($invoice){
        echo 'Create invoice Customer One '.$invoice;
    }
}
# Customer Two Defaults
namespace CustomerTwoNamespace;

class defaultClass extends \DefaultNameSpace\defaultClass {

    private $property;

    public function __construct()
    {
        return $this;
    }
    public function printInvoice(){
        echo 'Customer Two';
    }
}
# Call alsways default Class
$test = new \DefaultNameSpace\defaultClass('Two');
$test->printInvoice();
$test->createInvoice('123456');

?>

【问题讨论】:

  • 构造函数不能返回任何东西。

标签: php class namespaces overloading


【解决方案1】:

调用祖先类的构造函数时不能创建descendatnt类的对象,所以这段代码不能按你的意愿工作。

$test = new \DefaultNameSpace\defaultClass('Two'); 

要实现你想要的,你可以使用Factorypattern。简化(并且非常原始)示例:

function factoryMethod($type){
    $result = null;
    switch($type){
        case 1:
            $result = new Class1();
            break;
        case 2:
            $result = new Class2();
            break;
        default:
            $result = new ClassDefault();
            break;
    }
    return $result;
}

$obj = factoryMethod(2);
$obj->printInvoice();

请注意,您完全负责从实现所需接口的factoryMethod 对象返回,因为 PHP 不支持返回类型提示(据我所知)。

【讨论】:

  • 嗯,我知道这个选项。但这意味着我必须在我的默认类中对命名空间和客户进行硬编码。如果我们可以动态创建它会很棒,这意味着如果客户离开我不必进入我的代码来删除它。我只需要删除他的文件夹就完成了,命名空间将代表文件夹结构。
  • 我认为您的设计方法很奇怪...您只有几个客户,每个客户的业务逻辑存在重大差异?你不认为最好有一个单一的类“客户”并通过他们的IDs 来区分客户吗?
猜你喜欢
  • 2017-01-07
  • 2011-02-27
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
相关资源
最近更新 更多