何时使用静态方法或简单类方法?

时间:2014-08-21 11:16:56

标签: php zend-framework static instantiation

我很困惑是使用静态方法还是简单方法。

让我举个例子,我正在使用Zend framework 1项目 我有类似

的课程
class Example1
{
    public static function getVariable() {
       return is_numeric(Zend_Registry::get('config')->Variable) ? Zend_Registry::get('config')->Variable : 0;
    }

    public function calculateSome($param1, $param2) {
        $response = array();
        if($param2 == 0) { 
              $response = number_format(($param1 * self::getvariable()) /100);
        } else {
              $response = $param1;
        }
        return $response;
    }
}

用法:

  1. 目前我在整个项目中获得了Example1::getVariable()等变量值。
  2. 并计算首先实例化一个类$class1 = new Example1();,然后调用函数$class1->calculateSome(1, 0);

  3. 我很困惑,将calculateSome()更改为 public static 是否合适,并按此Example1::calculateSome(1, 0)进行调用或保持原样。

    我找到了何时使用static =>的链接 When to use static vs instantiated classes

    但我无法理解它的内容。

2 个答案:

答案 0 :(得分:3)

您可以在此处找到详细答案:How Not To Kill Your Testability Using Statics

TL; DR版本是:

  • 静态方法只不过是命名空间的函数,Foo::bar()foo_bar()没有显着差异。
  • 无论何时调用静态方法或函数,您都需要对依赖项进行硬编码。读取$bar = Foo::bar();的代码具有对特定Foo类的硬编码依赖关系。在不更改源代码的这一部分的情况下,无法更改Foo引用的内容。
  • 对象是“软”依赖项。 $bar = $foo->bar();具有灵活性,可以让空间更改$foo所指的内容。您可以使用依赖注入将代码与其他代码分离:

    function baz(Foo $foo) {
        $bar = $foo->bar();
        ...
    }
    
  • 您可以随时随地拨打Foo::bar()。如果Foo::bar依赖依赖 ,则在调用方法时很难保证此依赖项可用。要求对象实例化需要运行对象的构造函数,这可以强制要求设置对象的其余方法可以依赖的要求。

  • 构造函数以及将对象注入其他函数的依赖关系非常强大

    1. 在您的代码库中创建接缝,以便“将其拆开”并以灵活的方式将其整合在一起
    2. 将检查放入战略位置以确保代码的某些部分满足要求(在对象实例化时,构造函数强制执行其世界的一小部分,其对象的理智状态),这使得本地化更容易并包含失败。
    3. 想想它就像划分你的应用程序并在每个隔间之间放置防火墙,每个隔间都有一个负责每个隔间的主管;而不是每个人都在同一个房间里跑来跑去。

    4. 每当你写new Class时,你也可以写Class::staticMethod(),硬编码的依赖是相同的。

所以决定归结为:

  • 这门课的要求是什么?是否需要确保在其任何代码可以运行之前满足某些先决条件(例如,数据库连接需要可用),或者所有方法都只是自包含的小帮助方法?
  • 你有多大可能想把这个班级换成另一个班级?这个类是否会产生副作用(例如写入文件,修改某些全局状态),这可能并不总是令人满意,因此在某些情况下它的不同版本可能会有用吗?
  • 您是否可能同时需要此课程的多个实例,或者该类的性质是否需要单个实例?

开始使用单元测试,这需要您将应用程序拆开并单独测试每个小部件以确保其正常工作,并且您将看到对象实例化和依赖注入的优势所在。

答案 1 :(得分:0)

当方法涉及基于实例的属性/更改时,应保留non-static

如果它是整个type所需的方法,则使用static。

例如,您可以通过此代码段跟踪已创建实例的跟踪:

class Product {
 static $count;
 private $name;

 public function __construct($name) {
    $this->name = $name;
    self::$count++;
 }
 public function getName() {
    return $this->name;
 }
 public static function getCount() {
     return self:$count;
 }
}

$productA = new Product('A');
$productB = new Product('B');

echo $productA->getName(). ' and ' . $productB->getName(). '<br />'. PHP_EOL;
echo 'Total made products :' . Product::getCount();