свойства только для чтения в PHP?

Есть ли способ сделать свойство объекта доступным только для чтения в PHP? У меня есть объект с парой массивов. Я хочу получить к ним доступ, как обычно к массиву

echo $objObject->arrArray[0];

, но я не хочу иметь возможность писать в эти массивы после их создания. Создает локальную переменную похоже на PITA:

$arrArray = $objObject->getArray1();
echo $arrArray[0];

И в любом случае, хотя он сохраняет массив в нетронутом объекте, это не мешает мне переписать локальную переменную массива.

11
задан user151841 1 September 2010 в 17:25
поделиться

3 ответа

Ну, вопрос в том, где вы хотите, чтобы предотвратить запись от?

Первый шаг делает массив защищенным или частным, чтобы предотвратить писать из-за пределы области объекта:

protected $arrArray = array();

Если из «снаружи» массива, геттер сделает вас хорошо. Или:

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

И доступ к нему, как

$array = $obj->getArray();

или

public function __get($name) {
    return isset($this->$name) ? $this->$name : null;
}

и доступ к нему, как:

$array = $obj->arrArray;

Обратите внимание, что они не возвращают ссылки. Таким образом, вы не можете изменить исходный массив из за рамки объекта. Вы можете изменить сам массив ...

Если вам действительно нужно полностью непреложный массив, вы можете использовать объект, используя ArrayAccess ...

Или вы могли бы просто расширить ArrayObject и перезаписать все методы записи:

class ImmutableArrayObject extends ArrayObject {
    public function append($value) {
        throw new LogicException('Attempting to write to an immutable array');
    }
    public function exchangeArray($input) {
        throw new LogicException('Attempting to write to an immutable array');
    }
    public function offsetSet($index, $newval) {
        throw new LogicException('Attempting to write to an immutable array');
    }
    public function offsetUnset($index) {
        throw new LogicException('Attempting to write to an immutable array');
    }
}

Затем просто сделать $ this-> arrArray экземпляр объекта:

public function __construct(array $input) {
    $this->arrArray = new ImmutableArrayObject($input);
}

Он по-прежнему поддерживает большинство массива как использования:

count($this->arrArray);
echo $this->arrArray[0];
foreach ($this->arrArray as $key => $value) {}

, но если вы попытаетесь записать в него, вы получите LogicException ...

Да, но понимают, что если вам нужно написать к ней, все, что вам нужно сделать (в пределах объекта) является делать:

$newArray = $this->arrArray->getArrayCopy();
//Edit array here
$this->arrArray = new ImmutableArrayObject($newArray);
25
ответ дан 3 December 2019 в 02:29
поделиться

Если они определены, магические функции __get() и __set() будут вызываться всякий раз, когда осуществляется доступ к несуществующему или частному свойству. Это можно использовать для создания методов «получить» и «установить» для частных свойств и, например, сделать их доступными только для чтения или управлять данными при сохранении или извлечении в нем.

Например:

class Foo
{
  private $bar = 0;
  public $baz = 4; // Public properties will not be affected by __get() or __set()
  public function __get($name)
  {
    if($name == 'bar')
      return $this->bar;
    else
      return null;
  }
  public function __set($name, $value)
  {
    // ignore, since Foo::bar is read-only
  }
}

$myobj = new Foo();
echo $foo->bar; // Output is "0"
$foo->bar = 5;
echo $foo->bar; // Output is still "0", since the variable is read-only

См. также страницу руководства по перегрузке в PHP.

4
ответ дан 3 December 2019 в 02:29
поделиться

в классе сделайте так:

private $array;

function set_array($value) {
    $this->array = $value;
}

тогда просто установите так:

$obj->set_array($new_array);
0
ответ дан 3 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: