Size: a a a

2020 January 13

SA

Sergey Avseyev in phpGeeks
хотя хотелось бы чтобы было видно только то, что в интерфейсе
источник

AB

Artur BAGArt in phpGeeks
принято возвращать интерфейсы а не классы
источник

SA

Sergey Avseyev in phpGeeks
Artur BAGArt
Ошибкой будет вернуть что-то, что не реализует Named,
естественно. более. ты можешь вернуть наследника от Named
не наследника
источник

AB

Artur BAGArt in phpGeeks
и обзывать их NamedInterface
источник

SA

Sergey Avseyev in phpGeeks
я ж возвращаю Widget, который реализовал его
источник

AB

Artur BAGArt in phpGeeks
Sergey Avseyev
хотя хотелось бы чтобы было видно только то, что в интерфейсе
принципы SOLID -  открытости-закрытости  много интерфейсов лучше чем большлой
источник

P

PSYTRGLES in phpGeeks
мне кажется или речь о protected/private методах ?)))
источник

AB

Artur BAGArt in phpGeeks
нет
источник

AB

Artur BAGArt in phpGeeks
в ином видении ооп
источник

AB

Artur BAGArt in phpGeeks
параметры должны обеспечивать минимум интерфейс. результат должен обеспечивать минимум интерфейс
источник

SA

Sergey Avseyev in phpGeeks
<?php

interface ResizableInterface {
 public function width(): int;
 public function setWidth(int $arg);
}

interface NamedInterface {
 public function name(): string;
}

class WidgetClass implements NamedInterface, ResizableInterface {
 private $name;
 private $width;

 public function __construct(string $name, int $width) {
   $this->name = $name;
   $this->width = $width;
 }

 public function name(): string {
   return $this->name;
 }

 public function width(): int {
   return $this->width;
 }

 public function setWidth(int $arg) {
   $this->width = $arg;
 }
}

class FactoryClass {
 public function generate(): NamedInterface {
   $widget = new WidgetClass('top', 42);
   return $widget;
 }
}

$f = new FactoryClass();
// хотелось бы чтобы в $w были только методы
// NamedInterface доступны
$w = $f->generate();
// а по факту доступно всё, что в WidgetClass.
// Можно ли заставить генерировать тут ошибку?
$w->setWidth(42);
источник

SA

Sergey Avseyev in phpGeeks
вот так наверное лучше иллюстрируется проблема
источник

AB

Artur BAGArt in phpGeeks
Sergey Avseyev
<?php

interface ResizableInterface {
 public function width(): int;
 public function setWidth(int $arg);
}

interface NamedInterface {
 public function name(): string;
}

class WidgetClass implements NamedInterface, ResizableInterface {
 private $name;
 private $width;

 public function __construct(string $name, int $width) {
   $this->name = $name;
   $this->width = $width;
 }

 public function name(): string {
   return $this->name;
 }

 public function width(): int {
   return $this->width;
 }

 public function setWidth(int $arg) {
   $this->width = $arg;
 }
}

class FactoryClass {
 public function generate(): NamedInterface {
   $widget = new WidgetClass('top', 42);
   return $widget;
 }
}

$f = new FactoryClass();
// хотелось бы чтобы в $w были только методы
// NamedInterface доступны
$w = $f->generate();
// а по факту доступно всё, что в WidgetClass.
// Можно ли заставить генерировать тут ошибку?
$w->setWidth(42);
ну сделай класс который релализует только эти методы и никакие иные
источник

SA

Sergey Avseyev in phpGeeks
всмысле? что нельзя чтобы один класс реализовал больше одного интерфейса?
источник

AB

Artur BAGArt in phpGeeks
можешь обернуть это в сервис
источник

AB

Artur BAGArt in phpGeeks
там в рантайме проверять класс или того хуже через рефлеквсию что нет других методов
источник

AB

Artur BAGArt in phpGeeks
технически класс можно переписать, расширить или не загрузить твой а загрузить свой
источник

AB

Artur BAGArt in phpGeeks
(пхп+композер позволяют)
источник

AB

Artur BAGArt in phpGeeks
Sergey Avseyev
всмысле? что нельзя чтобы один класс реализовал больше одного интерфейса?
наоборот только так и надо
источник

SA

Sergey Avseyev in phpGeeks
хорошо, но разве это не делает бессмыссленным интерфейсы вообще?
источник