Я все еще новичок в ООП, и это, вероятно, простой вопрос, не уверенный, если я обдумываю это.
Допустим, у нас есть простой класс, подобный следующему, который мы можем использовать для создания экземпляра объекта, который может генерировать массив:
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)
Во-первых, у класса, которым вы поделились с нами, есть ряд проблем:
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']);
Для справки смотрите:
Например, смотрите:
Поскольку вы заполняете массив элементами только на fill_arr
эти предметы не будут доступны, пока вы не позвоните $arr = $obj->fill_arr();
,
Если вы хотите напрямую вызвать массив, то вам нужно заполнить этот массив в функции конструктора этого вызова следующим образом:
class gen_arr {
public $arr = array();
function __construct() {
$this->arr["key"] = "value";
}
}
Сначала заполните массив
$gen_arr = new gen_arr();
$gen_arr->fill_arr();
затем получить значения с помощью метода получения
$val = $gen_arr->getValue($key);
Метод получения будет таким
public function getValue($key) {
return $this->arr[$key];
}
И Certailny сделать частную собственность $ arr