【问题标题】:Should PHP class be used for this?应该为此使用 PHP 类吗?
【发布时间】:2012-01-12 09:44:15
【问题描述】:

我正在尝试确定是否适合使用一个类来声明一组约 20 个公共函数:

if (!class_exists('example')) { 

    class example {

        # Declare ~20 functions (methods), all of
        # which are public. (There's nothing else
        # in the class.)

        public static function one() { /* ... */ }
        public static function two() { /* ... */ }
        # ...

    } # class 

}

使方法可用:

example::one();
example::two();

上述方法 vs 有什么优点/缺点。只需这样做:

if (!defined('EXAMPLE_LOADED')) {

    define('EXAMPLE_LOADED', true);

    function example_one() { /* ... */ }
    function example_two() { /* ... */ }
    # ... 

}

使功能可用:

example_one();
example_two();

EDIT - 相关性能测试:

【问题讨论】:

  • 如果使用足够高的 PHP 版本,你也可以命名它们。
  • 您很可能不应该为此使用类。类不应用作任意函数的“容器”。
  • namespaces 可能会更好地为您服务 - 这取决于您使用的 PHP 版本。
  • @TimG/Peter/Felix - 非常感谢 - 我正在阅读有关命名空间的信息。我猜他们只有5.3+。因此,如果我将其命名为 example,那么这些函数将可以作为 example::one 等使用,对吧?
  • 我还不会为 WP 插件使用命名空间 - 我认为 5.3 仍然太新,即使它仍然有 2 年多的历史。 WordPress'requirements 声明 PHP 版本 5.2.4 或更高版本,我会坚持下去。

标签: php oop class


【解决方案1】:

这是一个关于这个主题的链接。

When to use static vs instantiated classes

我还要说我以前将类似的函数分组到纯静态类中。我喜欢它提供的语法糖。

format::usaPhone( $val );
format::usaZip( $val );
date::convertTz( $date, $tz1, $tz2 );

类似的东西。我建议您对此保持务实,并确保您最终所做的事情满足两件事。

  1. 您对结果很满意。
  2. 生成的代码有意义。

这听起来像是一种显而易见的陈述,但它很好地提醒我们,当一个简单的解决方案出现时,不要过度思考。

【讨论】:

  • 我主要关心的是让人们容易理解如何使用的东西,同时尽可能保持性能优化和可维护。我在问题中添加了一些性能测试的链接,尽管差异仅在您进行大量操作时才重要。将相关的函数组织成这样的静态实用程序类确实很有意义。我认为人们很容易理解,只要他们有好名声。如果您从未见过命名空间反斜杠,那么它是一次旅行,但我认为维护命名空间函数会更容易,因为您不需要使用self::
  • 别小看低级功能。 :) 如果需要,您可以使用命名约定命名空间。
  • 我一直想问,为什么是 if,为什么是定义?你来自C背景吗? C++,C#,C。只需对您的库使用 require_once,而无需检查是否已定义。
  • 是的,直线上升的功能绝对是最快的,而且绝对是人们最熟悉的。
  • 我想让它无法加载两次,即使它require_once 没有被使用,或者说它是否在两个单独的文件中的两个单独的插件中加载。没有 C 背景。
【解决方案2】:

oop 和函数式程序方法之间的区别在于开销。

绝对 oop 很好,它们可以对您的代码进行分组,更易于管理,并且使其成为理想的主要功能是您的代码将变得可重用,使其更加灵活,这就是为什么这种方法更适合大型项目或系统。 oop 的缺点是它的开销更昂贵,如果与函数式方法相比,它会更慢,尽管函数式方法在性能上要快得多,它不会像 oop 所期望的那样可重用,但这一切都取决于在你身上。

我对你的建议是,如果它真的是一个大项目,你的处理那么 oop 是非常好的,但如果你认为在 oop 中做这件事根本没有必要,那就去功能性的,或者如果可能的话,你也可以做程序性能比 2 更快的方式,但正如我所说,这完全取决于您的策略。

【讨论】:

    【解决方案3】:

    第一个案例增加抽象级别并帮助您(通常)分组辅助方法。

    最佳做法是将示例类移动到单独的文件中,然后在需要时制作

    require_once('./path/to/example.class.php');
    

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多