<?php
interface Int1 {
function func1();
}
interface Int2 {
function func2();
}
class MyClass implements Int1, Int2 {
public function func1() {
echo 1;
}
public function func2() {
echo 2;
}
}
$obj = new MyClass;
$obj->func1(); // Выводит 1
$obj->func2(); // Выводит 2
?>
Это пример из статьи http://www.phpworld.ru/php5/php5interface.php .
В интерфейсах нельзя писать код в методах, мы переопределяем методы в классах, которые наследуют интерфейсы. Так какой смысл в использовании методов в приведённом выше примере, если при исключении интерфейсов из кода ничего не изменится??
Спустя 4 минуты, 27 секунд (21.08.2011 - 20:33) alex12060 написал(а):
alex455
Это как бы отдельная сущность, как, основа. Интерфейсы, как и абстрактные классы - пустышки, и используются для написания определенного функционала под каждый интерфейс. Это актуально для разделения логики между сущностями.
Например, функция add() - абстрактна, она может быть одной, но, например, для добавления юзера - нужен свой функционал, для добавления новости - другой, для добавления ссылки - третий и так далее, вот здесь пригодятся интерфейсы.
Это как бы отдельная сущность, как, основа. Интерфейсы, как и абстрактные классы - пустышки, и используются для написания определенного функционала под каждый интерфейс. Это актуально для разделения логики между сущностями.
Например, функция add() - абстрактна, она может быть одной, но, например, для добавления юзера - нужен свой функционал, для добавления новости - другой, для добавления ссылки - третий и так далее, вот здесь пригодятся интерфейсы.
Спустя 37 минут, 2 секунды (21.08.2011 - 21:10) alex455 написал(а):
Почему бы не описать каждую отдельную функцию add() в своём классе? Зачем объявлять её в интерфейсе, а потом описывать в классах? Какая польза в итоге?
Спустя 9 минут, 32 секунды (21.08.2011 - 21:20) alex12060 написал(а):
alex455
Это все семантика. Не хочешь - не используй, но это может быть чревато последствиями![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Я знаю в принципе зачем они нужны, но на практике их не использую из-за ненадобности. Почитай тут, примеры есть хорошие.
Это все семантика. Не хочешь - не используй, но это может быть чревато последствиями
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Я знаю в принципе зачем они нужны, но на практике их не использую из-за ненадобности. Почитай тут, примеры есть хорошие.
Спустя 10 часов, 59 минут, 24 секунды (22.08.2011 - 08:19) linker написал(а):
alex455
Польза в том, что использование интерфейсов гарантирует реализацию методов, т.е. при их вызове описанного в интерфейсе метода никогда не случится так, что реализации метода не существует.
Польза в том, что использование интерфейсов гарантирует реализацию методов, т.е. при их вызове описанного в интерфейсе метода никогда не случится так, что реализации метода не существует.
Спустя 3 часа, 6 минут, 18 секунд (22.08.2011 - 11:26) alex455 написал(а):
Теперь понятно. Чем больше изучаю PHP, тем больше думаю, что разработчики PHP понаделали там кучу ненужного хлама. Неужели нельзя было сделать этот язык простым? Он же всё-таки для Web'а.
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 10 минут, 23 секунды (22.08.2011 - 11:36) VolDroN написал(а):
php итак прост, в сравнении с другими языками)
Спустя 6 минут, 37 секунд (22.08.2011 - 11:43) linker написал(а):
alex455
Разработчики PHP не заставляют тебя переходить на ООП. Если ты не понимаешь этой методологии, то ничего не мешает тебе оставаться на функциональной, где всё легко и просто.
Разработчики PHP не заставляют тебя переходить на ООП. Если ты не понимаешь этой методологии, то ничего не мешает тебе оставаться на функциональной, где всё легко и просто.
Спустя 38 минут, 54 секунды (22.08.2011 - 12:22) alex455 написал(а):
linker, я понимаю ООП в PHP, но не все его особенности. Сам уже делал примеры скриптов на ООП, всё работало. В деталях пытаюсь разобраться, чтобы понимать чужой код.
Спустя 11 часов, 30 минут, 32 секунды (22.08.2011 - 23:52) Guest написал(а):
Да, действительно, как же так такие "неучи" разработчики движка php реализовали столько хлама. А вот то что они вводят такие функциональности от того что огромное сообщество программистов просят об этих улучшениях и фичах, а ни как не разработчиков прихоти, ай давай сделаем чего там. :)
По поводу интерфейсов.
По поводу интерфейсов.
Цитата |
Польза в том, что использование интерфейсов гарантирует реализацию методов, т.е. при их вызове описанного в интерфейсе метода никогда не случится так, что реализации метода не существует. |
linker а слона то я и не заметил.
Это поверхность мощного инструмента интерфейсов. Сам интерфейс, вдумайтесь, задаёт ТИП абстракции и с этим типом работают клиенты, а не с его производными классами!
Например:
interface IProduct
{
public function add($name);
public function delete($name);
}
class Product implements IProduct
{
// Реализация методов
}
// Использование клиентом
$product = new Product();
// Если класс не имеет интерфейса IProduct (то есть он не является таким типом данных) создать исключение и оборвать
// дальнейшее исполнение программы. В этом случае мы избавляемся от
// неправильно инициализированного кода и соответственно области
// потенциальной ошибки. В этом участке мы работаем с верхне уровневой
// логикой то есть с абстрактными типами данных.
if($product instanceof IProduct)
{
throw new Exception('Class Product not type IProduct and not implements interface products');
}
А вот и другой случай с интерфейсами, когда они заданы в абстрактном классе и почему же :) их можно там и реализовать
abstract class AProduct
{
public function add($name)
{
// Логика
}
// Задаём обязательность реализации метода интерфейса в специализированных (дочерних классах)
abstract public function delete($name);
}
class Product extends AProduct
{
// Реализация методов
}
// Использование клиентом
$product = new Product();
// Если класс не имеет интерфейса AProduct (то есть он не является таким типом данных) создать исключение и оборвать
// дальнейшее исполнение программы. В этом случае мы избавляемся от
// неправильно инициализированного кода и соответственно области
// потенциальной ошибки
if($product instanceof AProduct)
{
throw new Exception('Class Product not type IProduct and not implements interface products');
}
Спустя 9 минут, 8 секунд (23.08.2011 - 00:01) kirik написал(а):
Цитата (Guest @ 22.08.2011 - 16:52) |
А вот и другой случай с интерфейсами, когда они заданы в абстрактном классе и почему же ![]() |
В теме было как раз про interface а не про abstract. Естественно в последнем можно описывать базовую реализацию.
Цитата (Guest @ 22.08.2011 - 16:52) |
Это поверхность мощного инструмента интерфейсов. |
И описали очередную "защиту от дурака".. не впечатлила моща
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 8 часов, 12 минут, 45 секунд (23.08.2011 - 08:14) linker написал(а):
Я уже приводил пример, ещё раз повторю. Наличие объекта какого-либо класса, ещё не гарантирует, что в нём реализован конкретный метод. Что есть файл - это поток, что есть сокет - это поток. Что есть ввод/вывод - это работа с потоком. Т.е. работа с файлами, сокетами - это работа с вводом/выводом. Значит у нас есть один интерфейс ввода/вывода, который объявляет методы: открыть, закрыть, прочитать, записать.
Вот как бы так.
interface IIoТаким образом, реализуя наши классы для работы с файлами и потоками, мы обязаны реализовать низкоуровневые методы из их общего интерфейса и в результате мы получаем абстракцию, которая позволяет нам одинаково работать с файлами или сокетами. У класса может быть много интерфейсов, а потому мы можем далее реализовывать какие-то свои специфические методы для каждого класса. Например, для класса работы с файлами мы можем реализовать интерфейс IFileSystem, в котором объявим методы специфические для элементов файловой системы (впоследствии мы можем реализовать класс для работы с директориями и присоединить к нему этот интерфейс): изменение прав доступа, владельца, размер, время создания, время модификации т.д. Таким образом с помощью данного интерфейса мы получаем новую абстракцию при работе с файлами и директориями.
{
public function open($mode);
public function close();
public function read();
public function write($buffer);
}
Вот как бы так.
Спустя 2 часа, 16 минут, 46 секунд (23.08.2011 - 10:31) Guest написал(а):
Цитата (kirik @ 22.08.2011 - 21:01) | ||
В теме было как раз про interface а не про abstract. Естественно в последнем можно описывать базовую реализацию. |
Ещё раз нужно повторить.
Не ведитесь на слово interface. Понимайте это слово в проектном аспекте а не семантическом определённого языка.
Цитата |
И описали очередную "защиту от дурака".. не впечатлила моща ![]() |
Значит , я так понимаю, в нормальных проектах Вы не участвовали эдак на годик в два (соответственно и с размерами и важностью) и проектировать в ООП не можете, иначе мнение было бы другим, почему? Да посмотрите только на паттерны ООП, они в 90% работают с интерфейсами абстракций и только с ними. Странно да, что люди с таким опытом это вывели (работа с интерфейсами) на профессиональный уровень, а Вы говорите
Цитата |
.. не впечатлила моща ![]() |
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 29 минут, 39 секунд (23.08.2011 - 11:00) kirik написал(а):
Цитата (Guest @ 23.08.2011 - 03:31) |
Не ведитесь на слово interface. Понимайте это слово в проектном аспекте а не семантическом определённого языка. |
В контексте первого поста, имелось ввиду "зачем нужен этот interface" иначе alex455 не писал бы:
Цитата (alex455 @ 21.08.2011 - 13:29) |
В интерфейсах нельзя писать код в методах |
Guest
/*хотел тут написать много текста, но передумал..*/
Если вам хочется подискутировать, создайте тему в флейме "Хочу похоливорить на тему ООП".
Спустя 7 минут, 21 секунда (23.08.2011 - 11:08) linker написал(а):
Где мой попкорн...