PHP / SOAP Uncaught SoapFault исключение: вызов неопределенного метода - PullRequest
1 голос
/ 28 марта 2011

Я пытаюсь заставить работать очень маленькую систему SOAP, но я борюсь с (маленькой) проблемой в течение нескольких дней, и Google не может помочь мне ни ...

Что я хочу сделать: я хочу сделать некоторые вещи с несколькими переменными, которые я передаю в классе. Проблема: я хочу использовать входящий класс в моем файле server.php в качестве объекта. Но это невозможно.

PHP-файл моего сервера:

class Lid
{
    public $NumberOfYears; //this one is public for example purpose only
    private $tew;
    private $School;
    private $Price;

    public function __construct($dump){
        $this->tew = "dump:".$dump;
    }

    public function getPrice(){
        return $this->Price;
    }
}
class Functies{
    public function __construct(Lid $Lid){
            $Lid->getPrice();   //What I want to do
        return new Lid($Lid->NumberOfYears);
    }
}

$classmap = array('Lid'=>'Lid');
$server = new SoapServer(NULL,
    array(
        'classmap'=>$classmap, 
            'uri' => "http://127.0.0.1/ns/soap/")
    );
$server->setClass("Functies");
$server->handle();

В классе "Functies" есть все методы, которые я хочу экспортировать через SOAP. Я использую транспортный класс Lid в качестве аргумента. На самом деле я хочу вызывать методы для входящего класса $ Lid. Когда я пытаюсь запустить клиентский скрипт, он возвращает следующую ошибку: Uncaught SoapFault exception: [SOAP-ENV:Server] Call to undefined method stdClass::getPrice()

Я понимаю проблему. PHP считает, что аргумент $ Lid является классом, а не объектом.

Итак, мои вопросы:

  1. Как я могу сделать $ Lid объектом?
  2. Как я могу получить доступ к своим личным / публичным переменным? Я пытался сделать это через $Lid->NumberOfYears, но это просто возвращает пустую строку.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 апреля 2011

После ожидания еще нескольких дней в ожидании новых ответов я просто сдался.

Мое решение: если PHP не создает объект для меня, я сделаю это самостоятельно.

Таким образом, вместо экспорта класса "Functies" я просто создал дополнительный класс (functiesNew) с теми же методами, но с обычными переменными в качестве входных данных (используя простые структуры данных, как говорил человек выше).

class functiesNew{
public function methodX($array){
    $Lid = new Lid();
    foreach($array as $name => $value){
        //fill the Lid object
    }

    // call the method we wanted to call from the beginning
    new Functies($Lid);
}   
}
0 голосов
/ 28 марта 2011

Около двух лет назад я пытался сделать что-то действительно близкое к тому, что вы пытаетесь здесь.

С тех пор я использую SOAP как можно меньше.

На самом делеSOAP работает довольно хорошо (я говорю «вполне» из-за неясного, избыточного и подробного определения WSDL и из-за ужасных, неясных сообщений об ошибках библиотеки PHP SOAP) для очень простых структур данных (ассоциативныхМассивы, являющиеся «лучшими», которые я смог использовать без проблем, если хорошо помню).

Как только я захотел «поделиться» полным классом с методами, расширенными свойствами и т. д. между клиентом ина сервере, было просто невозможно достичь моей цели (например, не удалось выполнить метод для переданного объекта).

Поэтому я отказался от этой идеи, прежде чем уделить ей слишком много времени и головной боли, и сделал все, что быломожно передавать данные, имеющие только простые структуры через SOAP ...

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...