Jump to content

Archived

This topic is now archived and is closed to further replies.

timothee

private method in web services classes?

Recommended Posts

Hi all,

I'm trying to create a webservice by using a class but I have some problems with sharing redundant code. I thought I could create private methods in my class to share the common code without exposing the function in the webservice but that is not working :(.

Is there a way to achieve this? Here is my sample webservice class. The method, I'd like to share is "connect".

[code]
<?php

require_once('DB.php');
require_once($_SERVER["DOCUMENT_ROOT"]."/page_tracker/config.inc.php");

/**
  * retrieve hit count for pages, or IDs, over specified period of time
  */
class PageTrackerWS {

        private $connected = false;
        private $db;

        /**
         * Initializes connection to the DB
         * @return void
         */
        private function connect()
        {
                if ($connected) return;

                global $config;

                $db = DB::Connect($config['dsn']);
                if (DB::isError($db)) {
                        throw new Exception($db->getUserInfo());
                }
                $db->setFetchMode(DB_FETCHMODE_ASSOC);
                $connected = true;
        }

        /**
         * Returns a list of all page that are marked for tracking
         * @return string[]
         */
        public function getTrackedPages()
        {
                try
                {
                        connect();
                        $db->setFetchMode(DB_FETCHMODE_ORDERED);
                        $req = $db->query("SELECT URI from URIS");
                        if (DB::isError($req)) throw new Exception($req->getUserInfo());

                        while ($row = $req->fetchRow())
                        {
                                $ret[] = $row[0];
                        }

                        return  $ret;
                }
                catch(Exception $e)
                {
                        // !! TODO
                        // return Fault here
                }
        }

        /**
         * Returns the internal ID of a tracked page
         * @param string $uri The uri
         * @return string
         */
        public function getPageID($uri)
        {
                try
                {
                        connect();
                        $ID = $db->getOne("SELECT ID from URIS WHERE URI=?", array($uri));
                        if (DB::isError($ID)) throw new Exception($ID->getUserInfo());
                        return $ID;
                }
                catch(Exception $e)
                {
                        // !! TODO
                        // return Fault here
                }
        }
}
?>
[/code]

Here is the code I use to test my service
[code]
$client = new SoapClient("http://localhost/wshelper/service.php?class=PageTrackerWS&wsdl");
$pages = $client->getTrackedPages();

foreach ($pages as $page)
        echo $page."<br/>";
[/code]

And the error I get:
[code]
Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Server] Call to undefined function connect() in /var/www/localhost/htdocs/page_tracker/WSTest.php:14 Stack trace:
#0 [internal function]: SoapClient->__call('getTrackedPages', Array)
#1 /var/www/localhost/htdocs/page_tracker/WSTest.php(14):
SoapClient->getTrackedPages() #2 {main} thrown in /var/www/localhost/htdocs/page_tracker/WSTest.php on line 14
[/code]

To assist me in managing my Web Service, I am using the [a href=\"http://jool.nl/new/1,webservice_helper.html\" target=\"_blank\"]WSHelper[/a] tool from jool.nl. Could that be causing problems?

Thanks in advance,
Tim.

Share this post


Link to post
Share on other sites
Never mind, David Kingma, the author of [a href=\"http://jool.nl/new/1,webservice_helper.html\" target=\"_blank\"]WSHelper[/a] pointed out my very dumb mistake: in PHP classes, I must refer to the current instance explicitely when calling methods: this->connect() instead of just connect().

Sorry for the noise.

Tim.

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.