Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: интерфейсы и ООП
 
 автор: beowulf   (14.01.2006 в 17:27)   письмо автору
 
 

не могу понять, с какой целью создаются интерфейсы
есть, например 2 фрагмента:

<?php
interface Int
{
  function 
one();
  function 
two();
}

class 
classOne implements Int
{
  function 
one()
  {
    echo 
1;
  }
  function 
two()
  {
    echo 
2;
  }
}
$obj=new classOne;
$obj->one();
?>

и такой

<?php
class classOne
{
  function 
one()
  {
    echo 
1;
  }
  function 
two()
  {
    echo 
2;
  }
}
$obj=new classOne;
$obj->one();
?>

Результат один. Так для чего создаются интерфейсы?

   
 
 автор: cheops   (15.01.2006 в 00:44)   письмо автору
 
   для: beowulf   (14.01.2006 в 17:27)
 

Во втором случае, вы можете не определять методы one() и two(), в первом случае это уже не получится. Любой класс расширяющий интерфейс Int обязан определить методы входящие в интерфейс. Это позволяет продиктовать для большого числа будующих классов имена методов, что позволит унифицировать программный интерфейс - иначе разработчики их назовут кто в лес, кто по дрова: one и two, first и second, begin и end, first и last и т.п. Когда будет классов 50 будет невозможно запомнить где какие методы пременяются, чтобы этого избежать придуманы интерфейсы.

   
 
 автор: isset   (15.01.2006 в 01:09)   письмо автору
 
   для: cheops   (15.01.2006 в 00:44)
 

Проще объяснить на примере, у нас есть три класса:


<?php
class {
function 
exec() {
return 
false;
}
}
class 
{
function 
exec() {
return 
$this->check();
}
private function 
check() {
 return 
1;
}
}
class 
{
function 
__constructor($obj) {
$obj->exec();
}
}
?>


Конструктор класса "c" принимает в качестве параметра объект класса "a" или "b". Но как проконтролировать что передан объект одного из этих классов? Ведь объект передать можно любой, в котором даже нет метода exec() или он выполняет другие задачи. Для этого классы "a" и "b" надо как-то "соединить". Для этого и применяются интерфейсы.



<?php
interface BooleanExec {
function 
exec();
}

class 
implements BooleanExec  {
function 
exec() {
return 
false;
}
}
class 
implements BooleanExec {
function 
exec() {
return 
$this->check();
}
private function 
check() {
 return 
1;
}
}
class 
{
function 
__constructor(BooleanExec $obj) {
$obj->exec();
}
}
?>


Теперь в сочетании с typehint мы можем гарантировать что будет передан правильный объект.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования