Помогите разобраться с экземплярами ООП

Artem_Paris

Новичок
Добрый день.
Помогите разобраться в чем косяк.

Ошбика следующая:
Uncaught TypeError: Return value of MyNamespace\MyClass::checkStatus() must be an instance of MyNamespace\Type\CheckStatusResponse, instance of Phpro\SoapClient\Type\MixedResult returned in /var/www/html/client/src/MyClient.php:38

Я так понимаю, в качестве возвращаемого ответа ожидается экземпляр класса CheckStatusResponse, а возвращается экземпляр класса Phpro\SoapClient\Type\MixedResult.

Но как его заставить возвращать верно?

MyClient.php
PHP:
<?php
namespace MyNamespace;

use MyNamespace\Type;
use Phpro\SoapClient\Type\RequestInterface;
use Phpro\SoapClient\Type\ResultInterface;
use Phpro\SoapClient\Exception\SoapException;

class MyClient extends \Phpro\SoapClient\Client
{
    /**
     * @param RequestInterface|Type\CheckStatusRequest $parameters
     * @return ResultInterface|Type\CheckStatusResponse
     * @throws SoapException
     */
    public function checkStatus(\MyNamespace\Type\CheckStatusRequest $parameters) : \MyNamespace\Type\CheckStatusResponse
    {
        return $this->call('checkStatus', $parameters);
    }
}
CheckStatusRequest.php
PHP:
<?php
namespace MyNamespace\Type;
use Phpro\SoapClient\Type\RequestInterface;

class CheckStatusRequest implements RequestInterface
{
    /**
     * @var string
     */
    private $Id = null;

    /**
     * Constructor
     *
     * @var string $Id
     */
    public function __construct($Id)
    {
        $this->Id = $Id;
    }

    /**
     * @return string
     */
    public function getId()
    {
        return $this->Id;
    }

    /**
     * @param string $Id
     * @return CheckStatusRequest
     */
    public function withId($Id)
    {
        $new = clone $this;
        $new->Id = $Id;

        return $new;
    }
}
CheckStatusResponse.php
PHP:
namespace MyNamespace\Type;
use Phpro\SoapClient\Type\ResultInterface;

class CheckStatusResponse implements ResultInterface
{

    /**
     * @var \MyNamespace\Type\Status
     */
    private $return = null;

    /**
     * @return \MyNamespace\Type\Status
     */
    public function getReturn()
    {
        return $this->return;
    }

    /**
     * @param \MyNamespace\Type\Status $return
     * @return CheckStatusResponse
     */
    public function withReturn($return)
    {
        $new = clone $this;
        $new->return = $return;

        return $new;
    }
}
 

nllabs

Новичок
Из этого кода непонятно что делает:
PHP:
\Phpro\SoapClient\Client->call('checkStatus', $parameters);
Покажите реализацию метода call.

Или, может быть, Вы ошибочно наследовали MyClient не от того класса ?
 

Artem_Paris

Новичок
Из этого кода непонятно что делает:
PHP:
\Phpro\SoapClient\Client->call('checkStatus', $parameters);
Покажите реализацию метода call.

Или, может быть, Вы ошибочно наследовали MyClient не от того класса ?
Код точно рабочий, но при попытке запустить с локального сервера всплывает такая ошибка.

PHP:
protected function call(string $method, RequestInterface $request): ResultInterface
    {
        $requestEvent = new Event\RequestEvent($this, $method, $request);
        $this->dispatch($requestEvent, Events::REQUEST);

        try {
            $arguments = ($request instanceof MultiArgumentRequestInterface) ? $request->getArguments() : [$request];
            $result = $this->engine->request($method, $arguments);

            if ($result instanceof ResultProviderInterface) {
                $result = $result->getResult();
            }

            if (!$result instanceof ResultInterface) {
                $result = new MixedResult($result);
            }
        } catch (\Exception $exception) {
            $soapException = SoapException::fromThrowable($exception);
            $this->dispatch(new Event\FaultEvent($this, $soapException, $requestEvent), Events::FAULT);
            throw $soapException;
        }

        $this->dispatch(new Event\ResponseEvent($this, $requestEvent, $result), Events::RESPONSE);

        return $result;
    }
 

WMix

герр M:)ller
Партнер клуба
PHP:
if (!$result instanceof ResultInterface) {
    $result = new MixedResult($result);
}
...
return $result;
но при этом ты настаиваешь, что вернется CheckStatusResponse
PHP:
public function checkStatus(\MyNamespace\Type\CheckStatusRequest $parameters) : \MyNamespace\Type\CheckStatusResponse
 

Artem_Paris

Новичок
PHP:
if (!$result instanceof ResultInterface) {
    $result = new MixedResult($result);
}
...
return $result;
но при этом ты настаиваешь, что вернется CheckStatusResponse
PHP:
public function checkStatus(\MyNamespace\Type\CheckStatusRequest $parameters) : \MyNamespace\Type\CheckStatusResponse
Но ведь \MyNamespace\Type\CheckStatusResponse подтягивает интерфейс ResultInterface.
Почему данное условие выполняется?
Код:
class CheckStatusResponse implements ResultInterface

Дело в том, что реализация метода call прописана в библиотеке phpro. и лезть туда, изменять что-то я не очень рискую. Но что тогда не так?
Подскажите плиз где что надо изменить и почему, чтобы я понял причину ошибки. а то уже мозги кипят.
Спасибо.
 

Artem_Paris

Новичок
но ты же не обещал абстрактный ResultInterface, ты обещал конкретный CheckStatusResponse.
CheckStatusResponse я обещаю, как я понимаю, вот в этой части:
PHP:
    public function checkStatus(\MyNamespace\Type\CheckStatusRequest $parameters) : [B][U]\MyNamespace\Type\CheckStatusResponse[/U][/B]
А как мне изменить? Если я выделенное заменяю на возвращаемый \Phpro\SoapClient\Type\MixedResult, тогда в контейнере при вызове метода getResult от $response ругается на отсутствие этого метода getReturn().

А $response содержит в себе следующее:
Код:
Phpro\SoapClient\Type\MixedResult Object
(
    [result:Phpro\SoapClient\Type\MixedResult:private] =>
)
В MixedResult имеется метод getResult() равный Null(или false).

Куда копать?
 

nik12345

Новичок
CheckStatusResponse я обещаю, как я понимаю, вот в этой части:
PHP:
    public function checkStatus(\MyNamespace\Type\CheckStatusRequest $parameters) : [B][U]\MyNamespace\Type\CheckStatusResponse[/U][/B]
А как мне изменить? Если я выделенное заменяю на возвращаемый \Phpro\SoapClient\Type\MixedResult, тогда в контейнере при вызове метода getResult от $response ругается на отсутствие этого метода getReturn().

А $response содержит в себе следующее:
Код:
Phpro\SoapClient\Type\MixedResult Object
(
    [result:Phpro\SoapClient\Type\MixedResult:private] =>
)
В MixedResult имеется метод getResult() равный Null(или false).

Куда копать?
Сам точно не знаю, а что делает вот эта строчка?
Код:
$this->dispatch($requestEvent, Events::REQUEST);
 

WMix

герр M:)ller
Партнер клуба
я не знаю что такое MixedResult но если он имплементирует ResultInterface то первая мысль возвращать этот тип, но и ограничения нужно понимать.
 
Сверху