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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Абстрактный класс

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: теория
Faab
Отправлено: 19 Февраля, 2013 - 12:53:22
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Я так понял что вся фишка абстрактных классов в том, что бы его дочерние классы содержали все абстрактные методы родителя, с их сигнатурой. Это значит реализующий метод должен содержать в себе количество аргументов абстрактного метода. Это понятно. И далее автор пишет: далее в нём (реализующем методе) должны воспроизводиться все уточнения типов класса!

Тут я встал немного. Куда именно я должен подставлять уточнения класса, да и в примерах по абстрактным классам я не встречал такие уточнения: TestClass $test.

PHP:
скопировать код в буфер обмена
  1.  
  2. abstract public function abstractFunction(TestClass $test);
  3.  


Если тут есть что пояснить про уточнение класса, то поясните пожалуйста.
 
 Top
vanicon
Отправлено: 19 Февраля, 2013 - 13:04:00
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Метод "abstractFunction" может принимать только 1 параметр, и этот параметр должен быть объектом класса TestClass.
Это означает что класс реализующий этот метод будет принимать только объекты класса TestClass и производных от него...


-----
Так было, так есть и так будет
 
 Top
esterio
Отправлено: 19 Февраля, 2013 - 13:07:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Вы знакомы что такое интерфейс?
Если да - то абстракный класс грубо говоря то же самое, только он может содержать реализацию.
невозможно создать екземпляр от абстракного класса.
Faab пишет:
abstract public function abstractFunction(TestClass $test);

Тут говорится что наследник должен реализировать метод abstractFunction
Faab пишет:
TestClass $test

Здесь указиваться что переменная $test должна быть екземпляром обьекта класса TestClass или же его наследником. Такое делаеться чтобы проверить тип входящей переменной
 
 Top
Faab
Отправлено: 19 Февраля, 2013 - 13:11:11
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Я понимаю так. Используя, абстрактный класс/метод в коде, можно и не делать уточнение типа класса. Но это может привести к ошибки (неверный тип класса, или данных).

Поэтому желательно использовать уточнение типа класса. Только я не понял где его использовать. В примере выше я с потолка поставил его в абстрактный метод. На практике, уточнение типа класса ставят в реализующий метод?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Февраля, 2013 - 13:13:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Faab пишет:
я не встречал такие уточнения: TestClass $test.

Это type hinting: http://php.net/manual/en/languag....typehinting.php
Возможность возложить проверку некоторых типов данный сразу на интерпретатор. К абстрактным классам отношения явного не имеет, возможность общая для всех функций и методов.


-----
PostgreSQL DBA
 
 Top
Faab
Отправлено: 19 Февраля, 2013 - 13:15:01
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




esterio пишет:
Вы знакомы что такое интерфейс?


Нет, это следующая глава. )) Там похоже вообще дебри. Я пока хочу более менее понять про абстрактный класс и уже начать знакомство с интерфейсами.
 
 Top
esterio
Отправлено: 19 Февраля, 2013 - 13:19:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Как то странно учить интерфейсы после абстракных классов. А что за книга. От себя могу порекомендировать к прочтению
Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования - 2011 год
 
 Top
Faab
Отправлено: 19 Февраля, 2013 - 13:22:02
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




esterio пишет:
Как то странно учить интерфейсы после абстракных классов. А что за книга. От себя могу порекомендировать к прочтению
Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования - 2011 год


Это она и есть. На 71 странице кончается глава об абстрактном классе и начинаются интерфейсы.
 
 Top
DelphinPRO
Отправлено: 19 Февраля, 2013 - 13:44:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




esterio пишет:
Как то странно учить интерфейсы после абстракных классов
esterio пишет:
От себя могу порекомендировать к прочтению
Мэтт Зандстра
Faab пишет:
Это она и есть.

Ха-ха сами читали книгу? Улыбка
сорри за офтопик. настроение хорошее..

(Отредактировано автором: 19 Февраля, 2013 - 13:45:37)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
esterio
Отправлено: 19 Февраля, 2013 - 14:03:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




DelphinPRO
Как раз читаю ее счас, только пробежался 1 главу, так как там почти вже все извесное для меня. Видимо зря Радость Радость Радость
 
 Top
Okula
Отправлено: 19 Февраля, 2013 - 16:58:41
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Faab, вот тебе небольшой пример реализации абстрактного класса.
PHP:
скопировать код в буфер обмена
  1. abstract class Animals {
  2.    
  3.     protected $send;
  4.     protected $name;
  5.    
  6.     public function __construct($name) {
  7.         $this->name = $name;
  8.     }
  9.  
  10.     public function getSend() {
  11.         return $this->send;
  12.     }
  13.    
  14.     abstract public function setSend();
  15.    
  16. }
  17.  
  18. class Cat extends Animals {
  19.    
  20.     public function setSend() {
  21.         $this->send = 'Кошка '.$this->name.' говорит: "Мяу!"';
  22.         return $this;
  23.     }
  24. }
  25.  
  26. class Dog extends Animals {
  27.    
  28.     public function setSend() {
  29.         $this->send = 'Собака '.$this->name.' говорит: "Гав!"';
  30.         return $this;
  31.     }
  32. }
  33.  
  34. $cat = new Cat('Мурка');
  35. $dog = new Dog('Тузик');
  36.  
  37. echo $cat->setSend()->getSend();
  38. echo '<br>';
  39. echo $dog->setSend()->getSend();

Результат работы скрипта:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Кошка Мурка говорит: "Мяу!"
  2. Собака Тузик говорит: "Гав!"
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Февраля, 2013 - 18:19:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Okula пишет:
public function getSend()
E_STRICT!
 
 Top
Okula
Отправлено: 20 Февраля, 2013 - 09:52:06
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




DeepVarvar, у меня в примере нет ошибок типа E_STRICT.
 
 Top
Faab
Отправлено: 20 Февраля, 2013 - 15:38:54
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Okula пишет:
Faab, вот тебе небольшой пример реализации абстрактного класса.


Спасибо, за пример. Чистый пример абстрактного класса. В нём мне всё понятно.

Я завис только с одной маленькой деталью: уточнением типа класса. Вы не могли бы расширить этот пример так, что бы в нём было бы желательным уточнение типа класса. Я понимаю как делать уточнение типа класса, но очень размыто понимаю "зачем и где".

Я понимаю, что всё зависит от задачи кода. Поставьте мне задачу так, пожалуйста, где без уточнения код мог бы привести к ошибке в вашем примере. Спасибо.
 
 Top
caballero
Отправлено: 20 Февраля, 2013 - 16:19:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Шо сие такое "уточнение типа"? Уточнение кем и где?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB