powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP5: вопрос по методам и свойствам
12 сообщений из 12, страница 1 из 1
PHP5: вопрос по методам и свойствам
    #39934575
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, у меня есть класс 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
PHP5: вопрос по методам и свойствам
    #39934638
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне этот способ не нравится следующим.

Допустим есть класс 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
PHP5: вопрос по методам и свойствам
    #39934680
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по тому, что я прочитал, в PHP в принципе нет возможности задать readonly-свойство.
Можно эмулировать магическими методами, но по этому поводу много споров и обычно сходятся на том, что магические методы нужны для фреймворков и динамического кода, а в прикладном коде они нежелательны.
Видимо придется использовать геттер в виде функции (getFields).
Правда такое "свойство" нельзя будет использовать в строках с двойными кавычками.
...
Рейтинг: 0 / 0
PHP5: вопрос по методам и свойствам
    #39934691
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рид онли свойство - это константа класса.
...
Рейтинг: 0 / 0
PHP5: вопрос по методам и свойствам
    #39934694
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константа это константа, ro-свойство от константы отличается.
Прежде всего тем, что может изменяться внутри класса (быть вычисляемым).
Кроме того, в PHP5 константа не может ссылаться на инстанс класса, только на скалярные значения.
...
Рейтинг: 0 / 0
PHP5: вопрос по методам и свойствам
    #39934733
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортем, что может изменяться
тогда это не рид онли.
...
Рейтинг: 0 / 0
PHP5: вопрос по методам и свойствам
    #39934748
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чушь.
constant — постоянный, неизменный.
read only — только для чтения.

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

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

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

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


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