Hello,
Andrei, as I can see, you're the author of ext/overload. As suggested
earlier, I've added a second parameter to sybase_fetch_object() which
allows users to pass an object to be filled with the results from the
fetched row (e.g. $article= sybase_fetch_object($q, new Article()); or
$article= sybase_fetch_object($q, 'Article')).

Well, if "Article" is an overloaded class, they'd probably expect that
their __set*-handlers are called when the object's properties are set.
Of course, object_and_properties_init() does not do this. But indeed,
it'd be quite nice if they would.

Thus, one would need the C functions call_get_handler and
call_set_handler to be declared not static but PHPAPI (is this right?)
and an additional method to test if a zend_class_entry is overloaded.

* http://sitten-polizei.de/php/overload.patch
  would make it work. Maybe macros would be a better way?

* http://sitten-polizei.de/php/sybase_ct.patch
  shows a sample usage (btw, is there any documentation on TSRM?)
  maybe _set_object_prop should be moved to ext/overload as a 
  utiltiy function?

I came up with this since I use sybase resultsets within SOAP, clearly
needing to distinguish strings from datetime types, int, floats and so
on. My first idea was to introduce a function
        sybase_bind_datatype(SYBASE_DATETIME, 'Date')
but why not make use of an already existing and powerful extension?

Maybe an example illustrates best what you'd be able to do:

Example
-------
<?php
  class Date {
    var $_u;
        
    function Date($m) {
      switch (gettype($m)) {
        case 'string': $this->_u= strtotime($m); break;
        case 'integer': $this->_u= $m; break;
      }
    }

    // [...]
  }

  class Article {
    var $article_id, $caption, $text, $lastchange;

    function __set($k, $v) {
      $this->$k= $v;
      return TRUE;
    }
        
    function __get($k) {
      return $this->$k;
    }

    function __set_lastchange($val) {
      $this->lastchange= &new Date($val);
      return TRUE;
    }

    // [...]
  }

  overload('Article');

  // [...]
  $q= sybase_query(
    'select article_id, caption, text, lastchange from article',
    $dbh
  );
  while ($article= sybase_fetch_object($q, 'Article')) {
    var_dump($article);
  }
  // [...]
?>

Sample Output
-------------
object(article)(4) {
  ["article_id"]=>
  int(6100)
  ["caption"]=>
  string(7) "Caption"
  ["text"]=>
  string(19) "This is the text:-)"
  ["lastchange"]=>
  &object(date)(1) {
    ["_u"]=>
    int(1025458800)
  }
}

- Timm



-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to