Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除了单例之外,在PHP中使用静态方法还有哪些令人信服的原因?_Php_Design Patterns_Static_Implementation - Fatal编程技术网

除了单例之外,在PHP中使用静态方法还有哪些令人信服的原因?

除了单例之外,在PHP中使用静态方法还有哪些令人信服的原因?,php,design-patterns,static,implementation,Php,Design Patterns,Static,Implementation,我最近回答了这个问题: 首先想到的当然是单身。几乎没有例外,其他回答者提供了相同的单例示例。但这让我想。。。除了创建单例之外,我从来没有真正使用过静态方法或属性 一个简短的搜索收集了许多关于使用静态方法的教程,几乎所有这些都实现了同一个单例类的一些变体 我真的很感兴趣:除了创建单例(或者仅仅是懒惰和想要一个全局函数)之外,我们还有什么理由创建静态方法 有没有人举过一个使用静态方法的实用例子,而使用动态设计模式无法更好地实现这种方法?这个例子可以是一个单例,如果这在它的上下文中有意义的话,但是除

我最近回答了这个问题:

首先想到的当然是单身。几乎没有例外,其他回答者提供了相同的单例示例。但这让我想。。。除了创建单例之外,我从来没有真正使用过静态方法或属性

一个简短的搜索收集了许多关于使用静态方法的教程,几乎所有这些都实现了同一个单例类的一些变体

我真的很感兴趣:除了创建单例(或者仅仅是懒惰和想要一个全局函数)之外,我们还有什么理由创建静态方法


有没有人举过一个使用静态方法的实用例子,而使用动态设计模式无法更好地实现这种方法?这个例子可以是一个单例,如果这在它的上下文中有意义的话,但是除了解决方案的单例方面之外,我对其他原因感兴趣。

它不一定是关于模式的。PHP不是一个持久性环境,所以任何对象实例的生命周期都可能是毫秒,但它需要内存分配/释放和额外的cpu周期。除非您需要可重用的对象或集合,否则我发现非静态对象没有什么正当性

开玩笑的回答,没有。静态方法很难测试或模拟


    • 工厂模式通常也会使用静态调用;但是对于任何不依赖实例属性或其他实例方法的类mathod,使用静态方法是明智的,特别是当出于性能原因定期调用它们时

      PHPExcel中以下方法的逻辑位置在PHPExcel_Cell类中,因为它直接涉及到操作单元地址(任何单元地址,不仅仅是特定实例的地址),但它对实例没有依赖性,所以我将其声明为静态

      public static function stringFromColumnIndex($pColumnIndex = 0) {
          if ($pColumnIndex < 26) {
              return chr(65 + $pColumnIndex);
          } elseif ($pColumnIndex < 702) {
              return chr(64 + ($pColumnIndex / 26)).chr(65 + $pColumnIndex % 26);
          }
          return chr(64 + (($pColumnIndex - 26) / 676)).chr(65 + ((($pColumnIndex - 26) % 676) / 26)).chr(65 + $pColumnIndex % 26);
      }
      
      公共静态函数stringFromColumnIndex($pColumnIndex=0){
      如果($pColumnIndex<26){
      返回chr(65+pColumnIndex美元);
      }elseif($pColumnIndex<702){
      返回chr(64+($pColumnIndex/26)).chr(65+$pColumnIndex%26);
      }
      返回chr(64+($pColumnIndex-26)/676)).chr(65+($pColumnIndex-26)%676)/26)).chr(65+$pColumnIndex%26);
      }
      

      这种方法并不特别难测试,同样的情况也适用于。避免二者兼而有之。Singletonitis-不确定的oop设计的瘟疫引用全局状态(类public static state也是全局状态)的静态方法可能会在测试中造成很大困难,尤其是全局状态变化的负面测试。静态方法(或全局函数)只对传递给它们的参数进行操作,不调用其他(或只调用已知的受信任)函数,非常容易测试-无需模拟。-1不错的链接,但它们都指出了根本问题。不要将静态方法和(特别是)全局状态结合起来。无状态静态方法实际上更容易测试,因为您不需要在不必要的对象构造上浪费时间/内存。它只需要一条简单的规则,“尊重本地范围”。不理解这意味着什么的开发人员不应该使用静态方法。静态方法不是由独角兽屁和仙女灰制成的魔法构造。它们只是名称空间的函数。当我测试另一个使用它的对象时,我该如何模拟静态函数调用呢?哦!我忘了只有一个真正的测试methodology@Mark詹姆斯提出了一个合理的问题。我想说的是,任何想在自己的项目中使用PHPExcel的人都有兴趣知道它的创建者建议如何测试它。@Gordon-我不能使用PHPUnit或SimpleTest进行模块测试,因为静态方法/属性以外的原因。。。我还没有弄清楚如何模拟自引用(双向)对象的嵌套树。我所有的单元测试都是手工制作的,通过phpt运行,并且测试是有序的,所以在任何可能引用静态测试之前,都会先测试静态测试。可能不是你想要的答案:但当测试PHPExcel本身时,用户最容易将其视为一个“黑匣子”,就像(例如)测试PDO一样。。。毕竟,你是如何模仿PDO中的结果集的?@Gordon-任何进一步的讨论都最好在别处继续。我想你和我对静态和某些设计模式的看法不一致,这可能不适合这个论坛。对不起,你不能,因为我没有使用任何。不过,过去两年安装的50多个客户端系统中没有一个遇到任何问题:)讽刺和。。。嗯。。。超级程序员,不是吗:)这偏离了主题,我退出了。+1表示PHP不是持久性的。所有这一切都可能是徒劳的。