我很困惑是使用静态方法还是简单方法。
让我举个例子,我正在使用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;
}
}
用法:
Example1::getVariable()
等变量值。$class1 = new Example1();
,然后调用函数$class1->calculateSome(1, 0);
我很困惑,将calculateSome()
更改为 public static
是否合适,并按此Example1::calculateSome(1, 0)
进行调用或保持原样。
我找到了何时使用static =>的链接 When to use static vs instantiated classes
但我无法理解它的内容。
答案 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
依赖依赖 ,则在调用方法时很难保证此依赖项可用。要求对象实例化需要运行对象的构造函数,这可以强制要求设置对象的其余方法可以依赖的要求。
构造函数以及将对象注入其他函数的依赖关系非常强大
想想它就像划分你的应用程序并在每个隔间之间放置防火墙,每个隔间都有一个负责每个隔间的主管;而不是每个人都在同一个房间里跑来跑去。
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();