查询数组或对象属性?

时间:2017-08-15 03:21:22

标签: php oop

我还是OOP的新手,这可能是一个简单的问题,不确定我是否过度思考这个问题。

我们假设我们有一个类似下面的简单类,我们可以使用它来实例化一个可以生成数组的对象:

class gen_arr {

   public $arr = array();

   public function fill_arr() {
     $this->arr["key"] = "value";
   }

}

// instantiate object from gen_arr
$obj = new gen_arr();

现在,如果你想获得对象数组项目的,你会先生成一个数组,然后回显该值像:

  

$ arr = $ obj-> fill_arr();

     

echo $ arr [" key"];

或者您会直接访问该对象的属性吗?

  

echo $ obj-> arr [" key"]

在实际代码中,属性是私有的,并且有一个方法允许查看属性数组,上面只是为了简化问题。

在这种情况下,是否存在性能方面的考虑和/或最佳实践?

更新:

如果最好的方法是从属性生成一个数组并访问该数组或直接访问该属性(通过getter方法),那么从答案中仍然不清楚

3 个答案:

答案 0 :(得分:2)

由于您只在// .java codes Foo a = ...// a Foo object. => { 'prop1': ooo } List<Foo> b = ... //< Array. => [ {'prop1': ooo}, {prop1: xxx} ] // Pass object to JSTL by HttpServletRequest or .. request.setAttribute('a', a); request.setAttribute('b', b); // .jsp codes <span>${a.prop1}</span> <script> var aa = ${a}; // ${a} => { 'prop1': ooo } var bb = ${b}; // ${b} => [ {'prop1': ooo}, {prop1: xxx} ] console.log(aa.prop1); console.log(bb[0].prop1); </script> 上填充数组中的项目,因此在您致电fill_arr之前,这些项目将无法使用。

如果你想直接调用数组,那么你必须在这个调用的构造函数上填充这个数组,如下所示:

$arr = $obj->fill_arr();

答案 1 :(得分:1)

首先填满数组

$gen_arr = new gen_arr();
$gen_arr->fill_arr();

然后使用getter方法获取值

$val = $gen_arr->getValue($key);

getter方法就像这样

public function getValue($key) {
    return $this->arr[$key];
}

并且certailny将$ arr属性设为私有

答案 2 :(得分:1)

首先,您与我们分享的课程存在一系列问题:

  • 其唯一的实例属性为public,任何人都可以修改
  • 你有一些时间耦合,需要在访问该值之前调用方法fill_arr()

封装

将实例属性的可见性从public降低到private,以便该属性只能由对象本身修改,并提供一个访问者:

class gen_arr
{
    private $arr;

    public function fill_arr() 
    {
        $this->arr["key"] = "value";
    }

    public function arr()
    {
        return $this->arr;
    }
}

时间耦合

删除方法fill_arr(),然后在以下某个选项中初始化属性$arr

  • 第一次访问时懒惰地初始化字段
  • 在构造函数中初始化字段
  • 使用默认值初始化字段
  • 使用构造函数
  • 注入的值初始化字段

第一次访问时懒惰地初始化字段

第一次访问时初始化字段:

class gen_arr
{
    private $arr;

    public function arr()
    {
        if (null === $this->arr) {
            $this->arr = [
                'key' => 'value',
            ];
        }

        return $this->arr;
    }
}

构造函数

中的Initialize字段

施工期间分配值:

class gen_arr
{
    private $arr;

    public function __construct()
    {
        $this->arr = [
            'key' => 'value',
        ];
    }

    public function arr()
    {
        return $this->arr;
    }
}

使用默认值

初始化字段

直接为字段分配值,如果您不需要进行任何计算,则可以正常工作:

class gen_arr
{
    private $arr = [
        'key' => 'value',
    ];

    public function arr()
    {
        return $this->arr;
    }
}

使用构造函数

注入的值初始化字段

如果值未经过硬编码或以其他方式计算(如前面的示例所示),并且您需要能够实例化具有不同值的对象,请通过构造函数注入值:

class gen_arr
{
    private $arr;

    public function __construct(array $arr)
    {
        $this->arr = $arr;
    }

    public function arr()
    {
        return $this->arr;
    }
}

访问和取消引用值

这看起来像是你的实际问题,所以答案是 - 当然 - 取决于它!

假设我们提供了一个访问者,而不是直接访问其他public字段:

自PHP 5.4起,以下是可能的:

$object = new gen_arr();

echo $object->arr()['key'];

如果你仍在使用旧版本的PHP,你显然不能这样做,而是必须做这样的事情:

$object = new gen_arr();

$arr = $object->arr();

echo $arr['key'];

但很大程度上,这个问题的答案取决于具体情况,以及你想要达到的目标。毕竟,可读性是维护的关键,因此引入解释变量可能是有意义的。

注意关于您的示例,您只需使用ArrayObject

$arr = new \ArrayObject([
    'key' => 'value',
]);

echo $arr['key']);

供参考,见:

有关示例,请参阅: