【问题标题】:What's the best way to store class variables in PHP? [closed]在 PHP 中存储类变量的最佳方式是什么? [关闭]
【发布时间】:2009-02-13 15:42:33
【问题描述】:

我目前的 PHP 类变量设置如下:

class someThing {

    private $cat;
    private $dog;
    private $mouse;
    private $hamster;
    private $zebra;
    private $lion;

    //getters, setters and other methods
}

但我也看到人们使用单个数组来存储所有变量:

class someThing {

    private $data = array();

    //getters, setters and other methods
}

您使用哪个,为什么?各有什么优缺点?

【问题讨论】:

    标签: php variables


    【解决方案1】:

    一般来说,第一个更好,因为其他人已经在这里说明了原因。

    但是,如果您需要在一个类上私下存储数据,但数据成员的足迹未知,您会经常看到您的第二个示例与 __get() __set() 挂钩以隐藏它们正在被存储私下里。

    class someThing {
    
        private $data = array();
    
        public function __get( $property )
        {
            if ( isset( $this->data[$property] ) )
            {
                return $this->data[$property];
            }
            return null;
        }
    
        public function __set( $property, $value )
        {
            $this->data[$property] = $value;
        }
    }
    

    那么,这个类的对象可以像stdClass的实例一样使用,只是你设置的成员都不是真正的public

    $o = new someThing()
    $o->cow = 'moo';
    $o->dog = 'woof';
    // etc
    

    此技术有其用途,但请注意 __get() 和 __set() 比直接设置公共属性要慢 10-12 倍。

    【讨论】:

      【解决方案2】:

      如果您使用的是private $data;,那么您刚刚获得了难以理解的数据块...如果您想弄清楚一个类是如何工作的,那么明确地说明它们将使您的生活变得更加轻松。

      另一个考虑因素是,如果您使用带有自动完成功能的 IDE - 这不适用于第二种方法。

      【讨论】:

        【解决方案3】:

        如果代码是重复的,数组和(foreach)循环可以让事情变得更整洁。您需要确定代码中的“动物”概念是否重复,或者代码是否需要挖掘每个成员的唯一性。

        如果我必须重复自己不止一次,我会循环。

        【讨论】:

          【解决方案4】:
          • 当您知道需要该变量时,请使用第一种方法。
          • 当您需要动态变量时,请使用第二种方法(变量的数组集合)。

          您可以组合这两种方法,因此一些变量是硬编码到您的类中的,而另一些则是动态的。与魔术方法相比,硬编码的变量将具有优先权。

          【讨论】:

            【解决方案5】:

            我更喜欢第一种方法,原因如下:

            在一个好的 IDE 中,类属性会显示出来,即使是私有/受保护的 更容易查看已定义的内容,从而减少两次存储相同信息的机会。 如果众所周知的公共汽车在回家的路上撞到你,另一个开发人员进来阅读你的代码会容易得多。 虽然它不适用于私有 var,但它适用于受保护的 var,在扩展此类的类中,您确实应该尽量避免使用第二种方法,以获得纯粹的可读性。

            另外,作为旁注,我几乎总是选择受保护而不是私有,除非我有非常具体的理由将其设为私有。

            我可能会使用第二种方法的唯一一次是,如果我要存储许多同一种事物的集合。

            【讨论】:

              猜你喜欢
              • 2012-10-03
              • 2010-10-10
              • 1970-01-01
              • 2022-01-18
              • 2021-05-06
              • 1970-01-01
              • 2010-10-22
              • 2021-09-01
              • 2012-04-08
              相关资源
              最近更新 更多