Сигнатуры методов в классе, реализующем интерфейс

WMix

герр M:)ller
Партнер клуба
hell0w0rd, какой смысл в параметре если его не будут использовать (интерфейс умалчивает)?
 

hell0w0rd

Продвинутый новичок
WMix,
PHP:
interface Hello
{
    public function sayHello();
}

class UserHello implements Hello
{
    public function sayHello($name = null)
    {
        echo 'hello ' . $name;
    }
}

$uh = new UserHello;
$uh->sayHello('vasya');
Не вижу в подобном использовании ничего плохого.
Это как интерфейс не контролирует прочие методы, также ему наплевать на необязательные параметры, предполагается что метод выполнится и без этого параметра.
 

Absinthe

жожо
Для сомневающихся: перепишите этот код на Java.
Все сразу станет на свои места ;)
Один метод - для интерфейса, один нет.
 

WMix

герр M:)ller
Партнер клуба
hell0w0rd, вопрос двуликий, если так вызываешь метод, зачем тебе интерфейс?

PHP:
interface Hello{
public function sayHello();
}

class UserHello implements Hello
{
    public function sayHello($name = null)
    {
        echo 'hello ' . $name;
    }
}

class A {
function b( Hello $c ){
$uh->sayHello(); 
}
}

$a =new A();
$a->b( new UserHello );
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
WMix, затем, что у меня может быть функция:
PHP:
function c (UserHello $uh) {}
Менее абстрактный пример - какие ни будь driverOptions, или логгер, где у консольного логгера есть $colorize = false по умолчанию
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
hell0w0rd, такой подход ни к чему хорошему не приведёт, в конце концов это спровоцирует на код WMix'а и будет нарушением интерфейса.

у консольного логгера есть $colorize = false по умолчанию
Тут надо это, либо трусы надеть, либо крестик снять. Либы ты юзаешь $output->write(), либо ты юзаешь http://api.symfony.com/2.4/Symfony/Bridge/Monolog/Handler/ConsoleHandler.html А $colorize в logMessage() — явный говнокод.

Разные сигнатуры — разные методы.

P.S. Интересный факт: в C# какое-то продолжительное время не было аргументов со значением по умолчанию вообще, всё через перегрузку. :)
 

WMix

герр M:)ller
Партнер клуба
у консольного логгера есть $colorize = false по умолчанию
ну и что мешает описать его в интерфейсе?

интерфейс это когда можно автоматизировать работу со всеми обьектами указанного типа не?
PHP:
interface LoggerInterface{
    public function info( $msg, array $context = null );
}
/*
class FileLogger implements LoggerInterface{
    public function info( $msg, $params ){ }
}
class FirebugLogger implements LoggerInterface{
    public function info( $msg, $params ){ }
}
*/
class Logger{

    private $logger = false;

    public function setLogger(LoggerInterface $logger ){
        $this->logger = $logger;
    }

    public function info( $msg, $params ){
        if($this->logger) $this->logger->info( $msg, $params );
    }
}

class Hello{

    public function __construct( Logger $logger ){
        $this->logger = $logger;
    }
  
    public function foo(){
        // куда засунем $colorize ?
        $this->logger->info( 'hallo %s !', array('гусаков') );
    }
}
 

hell0w0rd

Продвинутый новичок
WMix, да, можно автоматизировать. Вот только не всегда требуется абстракция в виде интерфейса - иногда мы точно знаем что нам нужен конкретный класс
Только изначально топик был о том, почему
PHP:
function foo($bar = null, $baz = null){}
не нарушает интерфейс
PHP:
function foo();
Вот я и удивился откуда вопрос, потому что реализация метода никак не нарушает интерфейс, метод по прежнему можно вызвать без аргументов.
 

HraKK

Мудак
Команда форума
Все вопросы снимаются тогда, когда начинаешь играть сам с собой в игру, представляя что любой класс — черный ящик, корпус для компьютера, а его интерфейс разъёмами в нем.

И тогда
PHP:
function foo($bar = null, $baz = null){}
выглядит разъёмом, который закрыт корпусом.

А как бы вы назвали инженеров спроектировавших дополнительный разъём для USB упирающимся в стенку корпуса?
 

HraKK

Мудак
Команда форума
hell0w0rd, того что ты не имеешь права обращаться к методу не определенному в интерфейсе. Поэтому если в интерфейсе нет параметров, то ты их не имеешь право передавать.
 

hell0w0rd

Продвинутый новичок
HraKK, почитай что я писал выше
PHP:
<?php

interface Foo
{
    public function bar();
}

class FooBar
{
    public function bar($foo = null) {}
    public function bla() {}
}

function bad(Foo $f)
{
    $f->bar('bla bla');
    $f->bla();
}

function good(Foo $f, FooBar $fb)
{
    $f->bar();
    $fb->bar('bla bla');
    $fb->bla();
}
 

hell0w0rd

Продвинутый новичок
WMix, странный вопрос, объект может использоваться в разных ситуациях. Где-то от него требуется реализация интерфейса, а где-то его собственные возможности.
 

Вурдалак

Продвинутый новичок
WMix, странный вопрос, объект может использоваться в разных ситуациях. Где-то от него требуется реализация интерфейса, а где-то его собственные возможности.
Нужно выделять эти «собственные возможности» в отдельный класс. Если ты используешь класс, а не интерфейс, то значит, что у тебя есть проблемы: либо интерфейс не покрывает все нужды, либо класс хочет слишком многое.
 
  • Like
Реакции: Gas

HraKK

Мудак
Команда форума
hell0w0rd, и что мне читать? Что ты выпиливаешь напильником дырки в корпусе и считаешь что это нормально? У меня друг как-то отпилил дополнительный хвостик у AGP PRO видеокарты потому что не влазил в AGP слот. Вот ты так же поступаешь в своем коде.
 

WMix

герр M:)ller
Партнер клуба
яб так написал бы.
PHP:
class FirebugLogger implements LoggerInterface{
   // dummy
   public function info( $msg, $params ){
     $this->infoGeneral( $msg, $params );
   }
   // real
   public function infoGeneral( $msg, $params, $colorized = false ){}
}
$logger = new FirebugLogger;
$logger->infoGeneral( 'hallo %s !', array('гусаков'), true );
 

Тугай

Новичок
да хрен с ним, с конструктором. я привел в качестве примера.
на месте конструктора мог бы быть обычный метод.
вопрос остается открытым
данное поведение описанное в первом посте - оно нормально?
Да. В PHP нет специального синтаксиса для указания в сигнатуре того, что в функцию передается переменное число параметров. Т.е. это как бы всегда подразумевается.
Скажем function a() { ... }, по правилам PHP можно вызвать как a(), a("bla bla..") a(1, '2', 3, array(5,6)) и т.п.

Поэтому дополнительные параметры со значениями по умолчанию, не создают другую сигнатуру.
 

DreamAdviser

Новичок
Подскажите пожалуйста новичку, что вообще такое сигнатуры методов?
 
Сверху