【问题标题】:PHP Class functions that are neither methods nor staticPHP 类函数既不是方法也不是静态的
【发布时间】:2011-08-02 09:58:31
【问题描述】:

我希望我的班级中有一个函数来执行一项简单的任务,例如:

function hello($name) { return 'hello '.$name; }

即不一定是静态的(尽管我想它可能是),但与对象无关(不需要引用 $this)。

我是否使用静态函数?即。

static function hello($name){return 'hello '.$name;}

并使用$string = ClassName::hello('Alex'); 调用它

或者有更好的方法吗?

谢谢!

【问题讨论】:

标签: php oop class object


【解决方案1】:

不需要调用对象实例并且应该能够在没有对象实例的情况下执行的类方法应声明为静态。

静态方法没有 $this 并且应该被称为 ClassName::methodName()。

静态方法可以访问其类的静态成员变量。

【讨论】:

  • 我也这么想;我只是对调用静态函数感到恼火,因为它看起来很奇怪——仍然习惯于在 PHP 中使用对象。谢谢!
  • 一个好的做法是将所有函数放入类或命名空间中。比拥有大量全局函数要好。
【解决方案2】:

静态函数应该是静态函数。
如果它是无状态的,则使用静态。

您也可以将一组类似的函数封装在一个类 *Utils 中。所以这些函数就像助手一样

class StringUtils{
function splitBy($delimeter,$val){....}
}

than you call it StringUtils::splitBy(..)

意思是如果与对象无关,就分开。

您可以将 utils 文件夹带到每个项目中,并不断重复使用它......

【讨论】:

  • @Gordon,是吗?有机会在不相关的对象中重用函数吗? UserEntity::SplitString($...) 不好,其他程序员怎么能找到呢?我觉得这个更好StringUtils::SplitString($...)
  • 因为一个对象应该有对其自身内部状态进行操作的方法。一个不这样做的对象缺乏连贯性,这是一个放错方法的明确标志。将看似相关的函数分组到一个类作用域中,基本上只是滥用类来获取命名空间。
  • 通过策略模式和/或多态性。
  • 我不明白如何使用策略模式和/或多态性来解决这些问题。如果你想重用一个简单的方法,比如 myArrayUnique() 并且你想在整个系统中使用它,你需要将它与你的业务逻辑、模型和实体分开。顺便说一句,这就是 Spring 和 Apache 用 JAVA 编写框架的方式。
  • myArrayUnique,顾名思义,是一个应该在 Array 对象上的方法。 PHP 的原生 ArrayObject 没有,但您可以通过扩展 ArrayObject 轻松添加该方法。对于常规数组类型,已经有一个独特的方法(并且它不是贴在某些 Utils 类上,而是一个全局函数)。在旁注中,如果您不在回复中输入我的名字,我不会收到有关回复的通知。
【解决方案3】:
  1. 这个类中的这个函数是什么?如果它不属于它 - 只需移动到其他地方
  2. ...如果属于,那么问题有可能在不创建对象的情况下调用它

【讨论】:

    【解决方案4】:

    如果没有对 $this 的引用(或将来可能对 $this 的引用),则将其设为静态。

    我这样说是因为有时我会选择:

    static function hello( $name ) { return 'hello '.$name; }
    

    在开发和扩展程序几个月后,我觉得有必要参考 $this,例如:

    function hello( $name ) { return $this->helloInLanguage[ $this->language ].' '.$name; };
    

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2021-12-03
      • 2014-02-14
      • 2023-03-11
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多