Size: a a a

2020 January 13

SA

Sergey Avseyev in phpGeeks
Может быть кто-то знает как можно (и можно ли) из функции вернуть интерфейс?

<?php

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

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

class Widget implements Named, Resizable {
 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;
 }
}

function generate(): Named {
  $widget = new Widget('top', 42);
  return $widget;
}

$w = generate();
// можно ли заставить генерировать тут ошибку?
$w->setWidth(42);
источник

SA

Sergey Avseyev in phpGeeks
так чтобы если hint говорит, что возвращаем интерфейс Named, то чтобы другие методы объекта не были доступны
источник

AB

Artur BAGArt in phpGeeks
function getObject(): ObjectClass
{}
источник

SA

Sergey Avseyev in phpGeeks
а я равзе generate не так объявил?
источник

AB

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

AB

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

AB

Artur BAGArt in phpGeeks
но дёргал ты не функцию класса а хз что
источник

SA

Sergey Avseyev in phpGeeks
просто похоже что в runtime хинты оказывают мало влияния. Ошибкой будет вернуть что-то, что не реализует Named, но не более. Я думал, что возвращая интерфейс я как бы ограничиваю доступ к объекту
источник

SA

Sergey Avseyev in phpGeeks
вот именно
источник

SA

Sergey Avseyev in phpGeeks
setWidth() реализована этим классом
источник

AB

Artur BAGArt in phpGeeks
$x = new Widget(.....)

$w = $x->generate()
источник

SA

Sergey Avseyev in phpGeeks
но как часть другого интерфейса
источник

SA

Sergey Avseyev in phpGeeks
generate() это не метод, а свободная функция
источник

AB

Artur BAGArt in phpGeeks
Sergey Avseyev
просто похоже что в runtime хинты оказывают мало влияния. Ошибкой будет вернуть что-то, что не реализует Named, но не более. Я думал, что возвращая интерфейс я как бы ограничиваю доступ к объекту
ограничить тоже можно сделав го "иммутабл"
источник

AB

Artur BAGArt in phpGeeks
те редактируемым только при констракте
источник

AB

Artur BAGArt in phpGeeks
и не иметь других сет-методов
источник

SA

Sergey Avseyev in phpGeeks
я не про мутабельность, а про интерфейс
источник

SA

Sergey Avseyev in phpGeeks
получается, что пользователю класса протекает вся реализация объекта
источник

L

Lord Voldemort in phpGeeks
Подскажите плиз, не работает форма... как правильно отправить данные

мне нужно отправить картинку на сервер и в бд записи сделать ( все это с одной формы)
источник

AB

Artur BAGArt in phpGeeks
Sergey Avseyev
просто похоже что в runtime хинты оказывают мало влияния. Ошибкой будет вернуть что-то, что не реализует Named, но не более. Я думал, что возвращая интерфейс я как бы ограничиваю доступ к объекту
Ошибкой будет вернуть что-то, что не реализует Named,
естественно. более. ты можешь вернуть наследника от Named
источник