[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Какой смысл в использовании интерфейсов?
alex455
<?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() - абстрактна, она может быть одной, но, например, для добавления юзера - нужен свой функционал, для добавления новости - другой, для добавления ссылки - третий и так далее, вот здесь пригодятся интерфейсы.

Спустя 37 минут, 2 секунды (21.08.2011 - 21:10) alex455 написал(а):
Почему бы не описать каждую отдельную функцию add() в своём классе? Зачем объявлять её в интерфейсе, а потом описывать в классах? Какая польза в итоге?

Спустя 9 минут, 32 секунды (21.08.2011 - 21:20) alex12060 написал(а):
alex455

Это все семантика. Не хочешь - не используй, но это может быть чревато последствиями 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

Спустя 10 минут, 23 секунды (22.08.2011 - 11:36) VolDroN написал(а):
php итак прост, в сравнении с другими языками)

Спустя 6 минут, 37 секунд (22.08.2011 - 11:43) linker написал(а):
alex455
Разработчики 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)
А вот и другой случай с интерфейсами, когда они заданы в абстрактном классе и почему же smile.gif

В теме было как раз про interface а не про abstract. Естественно в последнем можно описывать базовую реализацию.

Цитата (Guest @ 22.08.2011 - 16:52)
Это поверхность мощного инструмента интерфейсов.

И описали очередную "защиту от дурака".. не впечатлила моща smile.gif

Спустя 8 часов, 12 минут, 45 секунд (23.08.2011 - 08:14) linker написал(а):
Я уже приводил пример, ещё раз повторю. Наличие объекта какого-либо класса, ещё не гарантирует, что в нём реализован конкретный метод. Что есть файл - это поток, что есть сокет - это поток. Что есть ввод/вывод - это работа с потоком. Т.е. работа с файлами, сокетами - это работа с вводом/выводом. Значит у нас есть один интерфейс ввода/вывода, который объявляет методы: открыть, закрыть, прочитать, записать.
interface IIo
{
public function open($mode);
public function close();
public function read();
public function write($buffer);
}
Таким образом, реализуя наши классы для работы с файлами и потоками, мы обязаны реализовать низкоуровневые методы из их общего интерфейса и в результате мы получаем абстракцию, которая позволяет нам одинаково работать с файлами или сокетами. У класса может быть много интерфейсов, а потому мы можем далее реализовывать какие-то свои специфические методы для каждого класса. Например, для класса работы с файлами мы можем реализовать интерфейс IFileSystem, в котором объявим методы специфические для элементов файловой системы (впоследствии мы можем реализовать класс для работы с директориями и присоединить к нему этот интерфейс): изменение прав доступа, владельца, размер, время создания, время модификации т.д. Таким образом с помощью данного интерфейса мы получаем новую абстракцию при работе с файлами и директориями.

Вот как бы так.

Спустя 2 часа, 16 минут, 46 секунд (23.08.2011 - 10:31) Guest написал(а):
Цитата (kirik @ 22.08.2011 - 21:01)
Цитата (Guest @ 22.08.2011 - 16:52)
А вот и другой случай с интерфейсами, когда они заданы в абстрактном классе и почему же smile.gif

В теме было как раз про interface а не про abstract. Естественно в последнем можно описывать базовую реализацию.

Ещё раз нужно повторить.
Не ведитесь на слово interface. Понимайте это слово в проектном аспекте а не семантическом определённого языка.

Цитата
И описали очередную "защиту от дурака".. не впечатлила моща smile.gif

Значит , я так понимаю, в нормальных проектах Вы не участвовали эдак на годик в два (соответственно и с размерами и важностью) и проектировать в ООП не можете, иначе мнение было бы другим, почему? Да посмотрите только на паттерны ООП, они в 90% работают с интерфейсами абстракций и только с ними. Странно да, что люди с таким опытом это вывели (работа с интерфейсами) на профессиональный уровень, а Вы говорите
Цитата
.. не впечатлила моща smile.gif
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 написал(а):
Где мой попкорн...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.