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

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

echo $objObject->arrArray[0]; 

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

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

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

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

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

     protected $arrArray = array(); 

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

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

    Если определено, магические функции __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 .

    Если вы используете PHP 5+, вы можете сделать это с помощью методов __set () и __get () .

    Вы должны определить, как они работают, но должны делать именно это.

    Редактировать пример будет таким.

     class Example { private $var; public function __get($v) { if (is_array($v)) { foreach () { // handle it here } } else { return $this->$v; } } } 

    Это может быть не «лучший» способ сделать это, но он будет работать в зависимости от того, что вам нужно

    в классе, сделайте следующее:

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

    то вы просто так:

     $obj->set_array($new_array);