Запросить массив или свойство объекта?

Я все еще новичок в ООП, и это, вероятно, простой вопрос, не уверенный, если я обдумываю это.

Допустим, у нас есть простой класс, подобный следующему, который мы можем использовать для создания экземпляра объекта, который может генерировать массив:

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)

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;
}
}

Инициализировать поле в конструкторе

Назначьте значение во время строительства:

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']);

Для справки смотрите:

Например, смотрите:

1

Другие решения

Поскольку вы заполняете массив элементами только на fill_arrэти предметы не будут доступны, пока вы не позвоните $arr = $obj->fill_arr();,

Если вы хотите напрямую вызвать массив, то вам нужно заполнить этот массив в функции конструктора этого вызова следующим образом:

class gen_arr {

public $arr = array();

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

}
2

Сначала заполните массив

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

затем получить значения с помощью метода получения

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

Метод получения будет таким

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

И Certailny сделать частную собственность $ arr

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector