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

Форум PHP

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

 

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

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

тема: Fatal error: Cannot call abstract method MyInterface::MyMethod()
 
 автор: Iron   (10.03.2007 в 06:02)   письмо автору
 
 

Здравствуйте. Скажите, почему не работает этот код? Может быть я что-то неправильно сделал, или он и не должен работать?
<?php 
interface MyInterface
{
public function 
MyMethod($sometext);
}

class 
MyClass implements MyInterface
{
public function 
MyMethod($sometext){
echo 
$sometext;
}
}

MyInterface::MyMethod('Method called!'); 
?>

   
 
 автор: bronenos   (10.03.2007 в 07:50)   письмо автору
 
   для: Iron   (10.03.2007 в 06:02)
 

мне кажется вы ошиблись, в PHP интерфейсов нет, вот в Java они есть
(ошибки ведь наверняка дает вам код? )

а вообще прошу пардон
подсветка форума выделила слово interface, так что наверное это нововведение 5 версии языка, на котором я не пишу

   
 
 автор: Valick   (10.03.2007 в 08:16)   письмо автору
 
   для: bronenos   (10.03.2007 в 07:50)
 

Да есть там всё)

<?php 
 
  
interface MyInterface
  

    public function 
MyMethod($var); 
  } 

  class 
MyClass implements MyInterface
  

    public function 
MyMethod($sometext
    { 
      echo 
$sometext
    } 
  } 

  
$obj = new MyClass(); 
  
// Вызываем методы объекта 
  
$obj->MyMethod('Method called!'); 
?> 

   
 
 автор: Valick   (10.03.2007 в 08:32)   письмо автору
 
   для: Valick   (10.03.2007 в 08:16)
 

Или

MyClass::MyMethod('Method called!');

вместо

$obj->MyMethod('Method called!');

   
 
 автор: bronenos   (10.03.2007 в 08:57)   письмо автору
 
   для: Valick   (10.03.2007 в 08:32)
 

Если бы не было слова [i]interface[i], я бы сказал, что все правильно. А с ним не знаю, как работать... (никто не просвятит?)

   
 
 автор: Iron   (10.03.2007 в 09:39)   письмо автору
 
   для: Valick   (10.03.2007 в 08:32)
 

Уточню вопрос: Возможно ли вызвать метод MyMethod не через класс MyClass, реализующий интерфейс MyInterface , а через сам интерфейс?

   
 
 автор: isset   (10.03.2007 в 13:04)   письмо автору
 
   для: Iron   (10.03.2007 в 09:39)
 

нет.

[поправлено модератором]

   
 
 автор: cheops   (10.03.2007 в 13:05)   письмо автору
 
   для: bronenos   (10.03.2007 в 07:50)
 

Интерфейсы в PHP имеются, разработчики практически полностью передрали объектную модель Java.

   
 
 автор: cheops   (10.03.2007 в 13:09)   письмо автору
 
   для: Iron   (10.03.2007 в 06:02)
 

А вы не можете вызвать методы интерфейса - это действтительно чистая абстракция... Как не можете заполнить балон идеального газа. Следует вызывать метод класса
<?php  
  
interface MyInterface 
  

    public function 
MyMethod($sometext); 
  } 

  class 
MyClass implements MyInterface 
  

    public function 
MyMethod($sometext){ 
     echo 
$sometext
    } 
  } 

  
MyClass::MyMethod('Method called!');  
?>

   
 
 автор: t4f   (10.03.2007 в 13:11)   письмо автору
 
   для: cheops   (10.03.2007 в 13:09)
 

1. В интерфейсе нельзя указывать модификатор доступа - там все методы паблик.
2. Разве метод MyMethod статический, чтобы его можно было так вызывать?

   
 
 автор: cheops   (10.03.2007 в 13:17)   письмо автору
 
   для: t4f   (10.03.2007 в 13:11)
 

В PHP как-то странно всё реализовано, вы можете обращаться к методам, как будто они все статичные, даже если методы обращаются к ещё не инициализированным членам класса - вызов всё равно прходит, правда заканчивается фатальной ошибокой, однако весь код до обращения к члену класса выполняется.

   
 
 автор: t4f   (10.03.2007 в 13:21)   письмо автору
 
   для: cheops   (10.03.2007 в 13:17)
 

Офигеть! Чтож будем надеяться на улучшение ситуации в РНР 7 или 8 :)

   
 
 автор: Valick   (10.03.2007 в 17:26)   письмо автору
 
   для: t4f   (10.03.2007 в 13:21)
 

Пользуясь случаем хочу:
1) Извениться за то, что не понял утром вопрос. (проснулся я только к обеду))) )
2) В интерфейсе сначала в место public указывал abstract и получал ошибку, так тоже должно быть или как? Если я хочу, допустим, в одном классе указать функцию MyMethod public, а в другом классе MyMethod private, то как? Или у меня не должно возникать такой ситуации?

   
 
 автор: t4f   (10.03.2007 в 18:14)   письмо автору
 
   для: Valick   (10.03.2007 в 17:26)
 

В интерфейсе не надо указывать никаких модификаторов.
Для начала разберитесь зачем применяются интерфейсы, и подобные вопросы отпадут сразу. Интерфейс - это описание действий (методов) на высоком уровне абстракции. Если вы реализуете интерфейс, то принимаете его реализацию как есть, т.е. нельзя объявлять методы с отличными от паблик модификаторами в классах, реализующих интерфейс.

   
Rambler's Top100
вверх

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