在PHP中正确使用“getInstance”和静态方法?

时间:2013-07-04 21:48:43

标签: php

我对PHP中正确使用静态方法有点不清楚。

在以下场景中:

<?php

class Person 
{
    public $data;

    public function __construct($id) 
    {
        // Fetch record from our data source
        switch($id){
            case 1:
                $this->data = array('id'=>1, 'name'=>'Mike');
                break;
            case 2:
                $this->data = array('id'=>2, 'name'=>'Jennifer');
                break;
            default:
                exit('Record not found!');
        }
    }

    public function getName()
    {
        return $this->data['name'];
    }

    public static function getInstance($id)
    {
        return new self($id);
    }
} 

?>
然后我输出名字&#34; Mike&#34;和&#34;詹妮弗&#34;:

示例A

<?php 

foreach(array(1,2) as $id) 
    echo Person::getInstance($id)->getName(); 

?>

示例B

<?php 

foreach(array(1,2) as $id){
    $person = new Person($id);
    echo $person->getName();
}

?>

要么打印&#34; MikeJennifer&#34;,但我被告知示例A 错误,&#34;因为Person不是静态类&#34;。

不能宣布课程&#34;静态&#34;但是在PHP中,为什么它重要呢?

1 个答案:

答案 0 :(得分:3)

在“Emergent Design”中,Scott L Bain将此描述为抽象对象创建的第一步模式。

第1天:没有抽象......

$person = new Person($id);

第2天:为您构建对象的静态方法......

$person = Person::getPerson($id);

为什么呢?因为现在您在整个应用程序中只有一段代码知道如何“新建”一个人,而不是在整个应用程序中分配有许多代码,这些代码都具有这些知识。如果您将来更改构建人物对象的方式,则可以只更改getPerson静态方法。

第3天:您可能决定依靠对象构建器或存储库来创建对象。当您选择执行此操作时,您可以更新getPerson静态方法以使用构建器/存储库,并再次在一个位置进行更改。

这被称为“凝聚力”。拥有代码,您无需打开大量文件即可进行更改。