Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Перегрузка свойств классов
Форумы портала PHP.SU » » Вопросы новичков » Перегрузка свойств классов

Страниц (1): [1]
 

1. imper - 10 Сентября, 2012 - 10:10:11 - перейти к сообщению
Ребят здравствуйте, подскажите пожалуйста литературу про "перегрузка свойств классов"
читал мануал но там (лично мне) непонятно, для чего это нужно, и хотелось бы что бы "по русски" объяснили, и пояснили с примерами синтаксис и т д =-)
2. Okula - 10 Сентября, 2012 - 10:45:14 - перейти к сообщению
imper, вот тебе простой пример с использованием магического метода __set()
PHP:
скопировать код в буфер обмена
  1. class A {
  2.    
  3.     private $name;
  4.    
  5.     public function __construct($name) {
  6.         $this->name = $name;
  7.     }
  8.    
  9.     public function __set($name, $value) {
  10.         $this->$name = $value;
  11.     }
  12.    
  13.     public function showHello() {
  14.         echo 'Привет, '.$this->name.'.<br>';
  15.     }
  16.    
  17. }
  18.  
  19. #------------#
  20.  
  21. $a = new A('Джон');
  22. $a->showHello();
  23. $a->name = 'Лили';
  24. $a->showHello();
3. KingStar - 10 Сентября, 2012 - 10:47:58 - перейти к сообщению
не поймет, таких примеров можно привести кучу, ему разжевать нужно Подмигивание
4. Okula - 10 Сентября, 2012 - 14:40:42 - перейти к сообщению
KingStar, моё дело показать пример, а его понимать как он работает Улыбка
5. imper - 10 Сентября, 2012 - 22:14:51 - перейти к сообщению
вы молодцы! Радость

PHP:
скопировать код в буфер обмена
  1. http://ruseller.com/lessons.php?rub=37&id=1162



Вот развёрнутое объяснение по русски с примерами )
6. DlTA - 10 Сентября, 2012 - 23:43:57 - перейти к сообщению
Okula пишет:
моё дело показать пример, а его понимать как он работает
вообще плохой пример. бессмысленный, и запутывающий.
7. Okula - 10 Сентября, 2012 - 23:50:25 - перейти к сообщению
DlTA, и чем же плох мой пример? Он какраз показывает как перезагрузить приватное свойтство класса с помощью магического метода.
Без аргументов твоё заявление просто пустой звук.
8. DlTA - 10 Сентября, 2012 - 23:57:51 - перейти к сообщению
аргументирую:
Okula пишет:
пример (Отобразить)

1) вопрос стоит о перегрузке свойств, нафига тут засоряет взгляд конструктор
2) если уж показываете сетер, то куда спрятался геттер.
3) вытикает из 2, смысл в функции showHello??
4) использовать имя свойства такое же как и имя скрытого поля, вводит в заблуждение ибо. опосля возникает мысль что можно только так и делать
5) где коменты???
9. Okula - 11 Сентября, 2012 - 00:10:52 - перейти к сообщению
DlTA,
1) через конструктор я задаю первичное значение свойтву. Можно было сделать это статически
но я выбрал такой вариант.

2) не вижу смылсла объявлеть метод __get() так как тема о перезагрузке, а не об отображении приватных свойст. Тогда теряется весь смысл в значении private, потому что доступ к свойству будет возможен так же как и публичному, что опять "введёт в заблуждение" Улыбка
PHP:
скопировать код в буфер обмена
  1. $a->name;


3) смысл метода showHello() вытекает из его названия - демонстрация приветствия. Прошу заметить что это не рабочий класс какого-то приложения, а пример. Смысл примера - доступно показать как работает перезагрузка без лишних действий.

4) не неси чепуху! Если у тебя возникает такое впечатление то стоит перечитать страницы мануала про области видимости.

5) Не вижу необходимости. Класс довольно прост и коментировать там нечего. Пользователем будет выполнен только один метод showHello(), назначение которого вытекает из названия метода (о чём я уже писал ранее).
(Добавление)
С таким же успехом я мог показать такой пример:
PHP:
скопировать код в буфер обмена
  1. class A {
  2.     public $name = 'Джон';
  3. }
  4.  
  5. #-------#
  6.  
  7. $a = new A;
  8. echo $a->name.'<br>';
  9. $a->name = 'Лили';
  10. echo $a->name.'<br>';

Теперь ничего лишнего? Радость
Правда перезагрузка методов таким способом является дурным тоном.
10. Мелкий - 11 Сентября, 2012 - 08:33:39 - перейти к сообщению
Главный вопрос по перегрузке - вас интересует общепринятое значение или php'шное?

Общепринятое, но неприменимое к PHP, значение перегрузки - наличие нескольких методов с одинаковым именем, но различающиеся входными аргументами. Например, разное количество аргументов или их типы. А так же переопределение значений таких операторов, как сложение.
В показательный пример не так давно я, непривычно разбалованный PHP и MySQL, уткнулся в PostgreeSQL:
select md5(23856); ->нет такой функции
select md5('23856'); ->да здравствует результат

А PHP под перегрузкой понимает всего-лишь несколько волшебных методов ( http://php.net/manual/ru/languag....overloading.php )
11. DlTA - 11 Сентября, 2012 - 13:00:56 - перейти к сообщению
Okula, загляни на предложенную ссылку, вот это описание и примеры, четко, ясно и корректно.
imper пишет:
http://ruseller.com/lessons.php?rub=37&id=1162

магические там существенно ниже по странице описаны

 

Powered by ExBB FM 1.0 RC1