Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access level против Интерфейсов, Интерфейсы, access level 
:(
    Опции темы
Dima 2015
Дата 29.9.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



Вот такой простой код:

Код

interface TestInterface {
    
    private function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


Выдает ошибку:

Fatal error: Access type for interface method TestInterface::f1() must be omitted in D:\Project\Dima\interface.php on line 5

Меняем на:

Код

interface TestInterface {
    
    public function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


И имеем:

Fatal error: Access level to Test::f1() must be public (as in class TestInterface) in D:\Project\Dima\interface.php on line 9

Из чего я делаю вывод, что в интерфейсах могут быть только public-методы. Возникает вопрос, вернее недоумение тем, что конструируя "скелет" класса нельзя указать какими идентификаторами доступа должны обладать его методы...

Немного иная ситуация с абстрактными классами, хотя private методы там тоже нельзя предусмотреть, видать потому что они вообще не наследуются...
PM MAIL ICQ   Вверх
yurik_l
Дата 29.9.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


тарантиноман



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.9.2006

Репутация: 1
Всего: 3



Dima 2015, а как ты считаешь для чего нужны интерфейсы?
PM MAIL   Вверх
skyboy
Дата 29.9.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Dima 2015 @  29.9.2008,  11:39 Найти цитируемый пост)
Access type for interface method TestInterface::f1() must be omitted

Цитата

Тип доступа для метода TestInterface::f1() должен быть пропущен

Я могу понять незнание английского языка и нежелание ознакомиться с ним хотя бы на уровне чтения документации. но игнорирование большого количества автоматизированных переводчиков я понять никак не могу.
PM MAIL   Вверх
Dima 2015
Дата 29.9.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



yurik_l, вот именно этот вопрос у меня и возник когда напоролся на эти ошибки.


skyboy, не, я как раз все перевел и документацию смотрел, иначе бы сюда не полез smile

Ну пропущу я доступ для метода, напишу интерфейс так:

Код

interface TestInterface {
    
    function f1();

}

class Test implements TestInterface {
    
    private function f1() {
        echo 'f1';
    }
}


Будет та же самая ошибка.

http://www.php.net/manual/en/language.oop5.interfaces.php

Где тут про это, ткни носом плиз?
PM MAIL ICQ   Вверх
skyboy
Дата 29.9.2008, 14:28 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Dima 2015, да, правда, так и получается. прости за резкость.
странно, что в комментариях об этом не говорят.
PM MAIL   Вверх
Dima 2015
Дата 29.9.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



skyboy, то то и оно. Ты заметь что если писать в интерфейсе public он пишет, что не "должен быть пропущен" а то, что в классе, реализующем интерфейс доступ должен быть такой же, т.е. public. Логика какая то странная...

Ну и вообще странно. Если рассматривать интерфейс как "костяк" класса, то было бы очень логично что доступ к методам тоже можно жестко закрепить, чтобы при реализации там получать ошибки при попытке сделать публичным метод, который должен быть private или protected, а рельно получается что можно только методы перечислить, при чем исключительно публичные...

Это сообщение отредактировал(а) Dima 2015 - 29.9.2008, 15:27
PM MAIL ICQ   Вверх
xoma
Дата 29.9.2008, 16:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



Насколько мне известно интерфейс - это как раз и есть публичный интерфейс класса (описание его открытых public методов)...описывать в интерфейсе закрытые методы - нет особого смысла, так как они не входят в так называемый контракт класса (из java мира...). Мне кажется все вполне логично.

PM MAIL WWW   Вверх
Dima 2015
Дата 29.9.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: 2
Всего: 2



xoma, угу, уже и ссылочку нашел где это на прямую сказано...

http://phpclub.ru/faq/PHP5/Interface
PM MAIL ICQ   Вверх
skyboy
Дата 29.9.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(xoma @  29.9.2008,  15:58 Найти цитируемый пост)
Мне кажется все вполне логично.

однако, интерфейсы вполне можно использовать не только для реализации полиморфизма, но и для контроля работы программиста: так же, как и абстрактные классы, чтоб заставить программиста в классах-потомках чего-то там обязательно реализовывать некий функционал. с отличием, что интерфейсы допускают множественное наследование. в этом случае лично мне кажется вполне логичным использование модификаторов доступа. или наоборот - опускание модификатора доступа. к примеру, если для private-реализации ещё есть конфликт: в потомках методы, объявленные в интерфейсе, станут нереализованными и это надо контролировать, то вот почему нельзя сделать методы protected - мне не ясно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.