ФорумПрограммированиеPHP для идиотов → Объявления методов в потомке

Объявления методов в потомке

  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 20 апреля 2008 г. 21:55


    error_reporting(E_ALL | E_STRICT);

    class Foo
    {
    private function func($arg)
    {
    }
    }

    class Bar extends Foo
    {
    public function func()
    {
    }
    }


    Результат:
    Strict Standards: Declaration of Bar::func() should be compatible with that of Foo::func()


    не понимаю, что плохого в том, что бы изменить список параметров метода в потомке?
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 20 апреля 2008 г. 22:59, спустя 1 час 4 минуты 22 секунды

    Версия php4? Я проверил в 5,2,5 нет ошибок.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 20 апреля 2008 г. 23:10, спустя 11 минут 5 секунд

    хм… тут ещё фигня вылезла: если объявление класса и строка error_reporting в одном файле - никаких ошибок. Стоит вынести класс в отдельный файл и подключить через require - появляется то самое замечание

    Foo.class.php
    <?php
    class Foo
    {
       private function func($arg)
       {
       }
    }

    class Bar extends Foo
    {
       public function func()
       {
       }
    }
    ?>


    index.php
    <?php
    error_reporting(E_ALL | E_STRICT);
    require_once 'Foo.class.php';
    ?>


    баг?

    а версия 5.2.4…
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 апреля 2008 г. 10:32, спустя 11 часов 21 минуту 24 секунды

    При подключении файла происходит сначала синтаксический разбор, а потом выполняются инструкции.
    Когда всё в одном файле - сначала всё разбирается (с возникновением ошибки), а потом уже устанавливается уровень вывода этих ошибок.

    Изначальный смысл перегрузки методов в том, чтобы прикладной код, вызывал эти самые методы у объектов, не заморачиваясь, какой у объекта класс. То есть может меняться реализация метода, но не его интерфейс.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2008 г. 13:07, спустя 2 часа 35 минут 24 секунды

    Упорно не догоняю )

    В PHP все методы виртуальные (иначе просто и быть не может т.к. язык не типизированный), и => всегда вызываются методы класса, к которому непосредственно, относится объект. Какие тут могут быть заморочки?

    Ведь перегрузка, в принципе, тем и отличается от переопределения, что у в случае с перегрузкой (owerload) имеются 2 метода с одинаковым названием, но разными параметрами. Это при переопределении (owerride) сигнатуры методов базового класса и наследника совпадают. Получается, что в PHP перегрузка любых методов (кроме конструктора) считается "дурным тоном"?

    Я так смутно понимаю, что это как-то связано с тем, что списки аргументов никак не ограничены, отсутствие их типизации и типа результата накладывает ограничение - нельзя определить в одном классе два метода с одним и тем же именем. Но ведь классы-то разные.

    зы: а по поводу синтаксического разбора, спасибо, не знал )
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 апреля 2008 г. 13:16, спустя 9 минут 19 секунд

    Смотря чего ты хотел добиться.

    1. Чтобы у объекта стало 2 метода с одинаковыми именами, которые бы вызывались в зависимости от набора переданных аргументов?
    В пыхе такого нет, оно даже принципиально сложно организуется, да и вообще не нужно в силу нетипизированности языка и неограниченности количества передаваемых аргументов.

    2. Если owerride, то, да сигнатуры должны совпадать. Да и вообще хз как это всё будет себя вести при переопределении private -> public.
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 апреля 2008 г. 13:53, спустя 36 минут 18 секунд

    Что задумывалось:

    недавно обсуждалось (топик уже не помню), что если объект при инстанцировании получает данные из внешнего источник (файл, сокет, БД), то этот процесс должен выноситься в статический метод. Пример, пусть имеется класс File:
    $foo = File::open($fileName); // открываем существующий файл
    $bar = new File() // 'как бы' создаем новый файл

    У File есть наследник (конкретизация) - класс ConcreteFile, в котором имя файла задано константой. Тогда

    class ConcreteFile extends File
    {

       public static open()
       {
           return parent::open('file.txt');
       }

    }

    $foo = ConcreteFile::open();

    - т.е. указывать имя файла в аргументах уже излишне.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 апреля 2008 г. 14:19, спустя 26 минут 35 секунд

    Статические методы вообще во многом не так работают, как обычные, лучше на них изначально и тестить.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 25 апреля 2008 г. 16:23, спустя 4 дня 2 часа 3 минуты

    А что пыха не ругаеться на переопределение с привата на паблик?

    Если сильно мешают аргументы то можно их получать с помощью func_get_args
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2008 г. 17:55, спустя 1 час 32 минуты 8 секунд

    А что пыха не ругаеться на переопределение с привата на паблик?

    Нет, ей не нравится разница в списках аргументов.

    Если использовать func_get_args(), то в описании метода можно вообще не указывать его параметров, а это не очень хорошо - если к примеру, мне нужно что бы один параметр передавался обязательно. Вообще эту функцию, имхо, лучше использовать только там, где в функцию нужно передавать неограниченное множество однотипных аргументов.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 25 апреля 2008 г. 18:37, спустя 41 минуту 40 секунд

    все правильно, я просто предложил это как один из вариантов

Пожалуйста, авторизуйтесь, чтобы написать комментарий!