php什么时候用静态的方法,关于php:何时使用静态方法或简单类方法?

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

让我举个例子,我正在使用Zend框架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的链接=>何时使用静态vs实例化类

但我不明白它说的是什么。

长话短说:如何不使用静态的方法破坏您的可测试性

您可以在这里找到一个很长的答案:如何不使用静态方法破坏您的可测试性

它的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(),硬编码的依赖关系是相同的。

所以决定归结为:

这门课有什么要求?它是否需要确保在运行任何代码之前满足某些前提条件(例如,数据库连接需要可用),或者所有方法都只是独立的小助手方法?

你有多可能想用这门课代替另一门课?此类是否会产生副作用(例如,写入文件、修改某些全局状态),这些副作用可能并不总是可取的,因此在某些情况下,它的不同版本可能会有用?

您可能同时需要该类的多个实例,或者该类的性质是否使得不需要单独的实例?

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

当方法涉及到基于实例的属性/更改时,您应该保留它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(). '
'. PHP_EOL;

echo 'Total made products :' . Product::getCount();

根据上面的代码,是否应该将函数改为public static function calculateSome(1,0),因为这个函数根据传递的参数处理一些计算。

如果该类被称为"calculator&180";而您不需要存储任何基于实例的成员,那么您可以将其保留为&180;static&180;imo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值