interface Hello
{
public function sayHello();
}
class UserHello implements Hello
{
public function sayHello($name = null)
{
echo 'hello ' . $name;
}
}
$uh = new UserHello;
$uh->sayHello('vasya');
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 );
Тут надо это, либо трусы надеть, либо крестик снять. Либы ты юзаешь $output->write(), либо ты юзаешь http://api.symfony.com/2.4/Symfony/Bridge/Monolog/Handler/ConsoleHandler.html А $colorize в logMessage() — явный говнокод.у консольного логгера есть $colorize = false по умолчанию
ну и что мешает описать его в интерфейсе?у консольного логгера есть $colorize = false по умолчанию
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('гусаков') );
}
}
function foo($bar = null, $baz = null){}
function foo();
function foo($bar = null, $baz = null){}
<?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();
}
Нужно выделять эти «собственные возможности» в отдельный класс. Если ты используешь класс, а не интерфейс, то значит, что у тебя есть проблемы: либо интерфейс не покрывает все нужды, либо класс хочет слишком многое.WMix, странный вопрос, объект может использоваться в разных ситуациях. Где-то от него требуется реализация интерфейса, а где-то его собственные возможности.
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 нет специального синтаксиса для указания в сигнатуре того, что в функцию передается переменное число параметров. Т.е. это как бы всегда подразумевается.да хрен с ним, с конструктором. я привел в качестве примера.
на месте конструктора мог бы быть обычный метод.
вопрос остается открытым
данное поведение описанное в первом посте - оно нормально?