Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP5: вопрос по методам и свойствам / 12 сообщений из 12, страница 1 из 1
05.03.2020, 12:15
    #39934575
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Допустим, у меня есть класс AppField, у него есть свойства code и title.
Я не хочу создавать эти свойства просто объявлением public-переменной, потому что мне нужен контроль над значениями. Следовательно мне нужен геттер и сеттер для свойства. Но в PHP5 нет геттеров, разве что через магические методы.
Кроме того, я бы хотел использовать и альтернативный способ в виде функции с необязательным параметром: code() для чтения текущего значения, code(value) для задания нового значения.
Вроде бы должно быть так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
class AppField
{
	private $local = ['code'=>null, 'title'=>null, 'description'=>null];
	private function _fail($name)
	{
		if (!array_key_exists($name, $this->local))
		{
			$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1];
			trigger_error("Invalid property '{$name}' in {$bt['file']}:{$bt['line']}", E_USER_NOTICE);
			return true;
		}
	}
	public function __set($name, $value)
	{
		if ($this->_fail($name)) return;
		$this->local[$name] = $value;
	}
	public function __get($name)
	{
		if ($this->_fail($name)) return;
		return $this->local[$name];
	}
	public function __isset($name)
	{
		if ($this->_fail($name)) return;
		return isset($this->local[$name]);
	}
	public function __unset ($name)
	{
		if ($this->_fail($name)) return;
		$this->local[$name] = null;
	}
	public function __call($name, $arguments)
	{
		if ($this->_fail($name)) return;
		if (isset($arguments)) $this->local[$name] = $arguments[0];
		return $this->local[$name];
	}
}


Или есть другие способы?
...
Рейтинг: 0 / 0
05.03.2020, 13:22
    #39934638
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Мне этот способ не нравится следующим.

Допустим есть класс Field, коллекция этих классов Fields и класс Sections, в котором должно быть свойство Fields, ссылающееся на коллекцию Fields. Разумеется свойство Fields должно быть readonly, чтобы его нельзя было очистить или переустановить, поэтому просто объявить public $Fields = new Fields нельзя.
Если делать через магические методы, то приходится делать так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
class Field {
  public $name;
  public $value;
  function __construct($name, $value) {
    $this->name = $name;
    $this->value = $value;
  }
}

class Fields {
  private $list = [];
  function add($name, $value) { $this->list[$name] = new Field($name, $value); }
  function delete($name) { unset($this->list[$name]); }
...
}

class Sections {
  private $local = ['code'=>null, 'title'=>null, 'description'=>null];
  private $fields;
  ...
  function __construct() {
    $this->fields = new Fields;
  }
  ...
  public function __set($name, $value) {
	if ($name == 'Fields') {
		$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[0];
		trigger_error("Read-only property '{$name}' in {$bt['file']}:{$bt['line']}", E_USER_NOTICE);
		return;
	}
	if ($this->_fail($name)) return;
	$this->local[$name] = $value;
  }
  public function __get($name) {
	if ($name == 'Fields') {
		return $this->Fields;
	}
	if ($this->_fail($name)) return;
	return $this->local[$name];
  }
...
}



Это смотрится не очень хорошо, плюс если я захочу добавить итератор, то при таком подходе его сделать будет сложнее.

Фактически мне просто нужен геттер, без сеттера.
Можно ли что-то такое сделать?
...
Рейтинг: 0 / 0
05.03.2020, 14:29
    #39934680
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Судя по тому, что я прочитал, в PHP в принципе нет возможности задать readonly-свойство.
Можно эмулировать магическими методами, но по этому поводу много споров и обычно сходятся на том, что магические методы нужны для фреймворков и динамического кода, а в прикладном коде они нежелательны.
Видимо придется использовать геттер в виде функции (getFields).
Правда такое "свойство" нельзя будет использовать в строках с двойными кавычками.
...
Рейтинг: 0 / 0
05.03.2020, 14:53
    #39934691
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
рид онли свойство - это константа класса.
...
Рейтинг: 0 / 0
05.03.2020, 14:59
    #39934694
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Константа это константа, ro-свойство от константы отличается.
Прежде всего тем, что может изменяться внутри класса (быть вычисляемым).
Кроме того, в PHP5 константа не может ссылаться на инстанс класса, только на скалярные значения.
...
Рейтинг: 0 / 0
05.03.2020, 15:43
    #39934733
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
автортем, что может изменяться
тогда это не рид онли.
...
Рейтинг: 0 / 0
05.03.2020, 15:56
    #39934748
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Чушь.
constant — постоянный, неизменный.
read only — только для чтения.

У массивов или коллекций есть свойство count или length, возвращающее количество элементов (в массиве или коллекции).
Его нельзя задавать самому, потому что оно read only.
Но оно может изменяться.
...
Рейтинг: 0 / 0
05.03.2020, 17:02
    #39934806
PHP5: вопрос по методам и свойствам
у памяти есть всего 2 операции: read и write
если память "read only", значит ничего туда записать нельзя . Точка.
Alibek B.
Его нельзя задавать самому, потому что оно read only.
Но оно может изменяться.

изменяться "read only" НЕ может.
...
Рейтинг: 0 / 0
05.03.2020, 17:14
    #39934820
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Извне изменять нельзя.
Изнутри можно.
...
Рейтинг: 0 / 0
05.03.2020, 20:00
    #39934913
PHP5: вопрос по методам и свойствам
если можно, значит уже не read only. астанавитесь!
...
Рейтинг: 0 / 0
05.03.2020, 20:02
    #39934914
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Алексей Роза
астанавитесь!

Да, заканчивайте... Ясно же, что человеку надо.
...
Рейтинг: 0 / 0
05.03.2020, 20:25
    #39934926
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP5: вопрос по методам и свойствам
Повторю вопрос — вы видели свойство length у массивов и объектов JS?
Это свойство (не метод), оно readonly. Но оно изменяется, когда изменяется количество элементов массива.
Или текстовое поле "только чтение" в формах Windows — пользователь не может его изменить, но программа может.

Мне нужно свойство, которое будет ссылаться на объект (инстанс класса) и которое нельзя изменить снаружи.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP5: вопрос по методам и свойствам / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]