phpbar.de logo

Mailinglisten-Archive

[php] Extending PHP, Zend API

[php] Extending PHP, Zend API

Ulf Wendel ulf_(at)_redsys.de
Thu, 09 Mar 2000 00:27:03 +0000


Holger Bahr wrote:
> Handelt es sich bei den Funktionen um PHP4 oder um 'native' Zend Funktionen
> (php wird
> --with-zend compiliert (oder so))

Es sind Funktionen aus der Zend API, also Funktionen, die PHP intern
benutzt werden. Bereits in PHP3 findet man Funktionen wie
convert_to_long(), die zur Typwandlung von Daten dienen, die an PHP
Funktionen übergeben werden. 

Ein Blick in den Source von PHP3 und PHP3 klärt Teile des Rätsels auf.
convert_to_long() ist in der PHP3 und der Zend API eine Funktion. Diese
Funktion versucht eine Typwandlung im zur Datenspeicherung genutzen
struct. convert_to_long_ex hingegen ist keine Funktion. Es ist nur ein
mit define definiertet Textersatz:

#define convert_to_long_ex(ppzv)       \
  if ((*ppzv)->type!=IS_LONG) {	       \
    if (!(*ppzv)->is_ref) {            \
      SEPARATE_ZVAL(ppzv);             \
    }                                  \
convert_to_long(*ppzv);                \
[zend_operators.h]

Hierin findet eine weitere Definition Verwendung:

#define SEPARATE_ZVAL(ppz)            \
  {                                   \ 
    zval *orig_ptr = *(ppzv);         \
                                      \
    if (orig_ptr->refcount>1) {       \
      orig_ptr->refcount--;           \
      *(ppzv) = (zval *) emalloc(sizeof(zval));  \
      **(ppzv) = *orig_ptr;	      \
      zval_copy_ctor(*(ppzv));        \
      (*(ppzv))->refcount=1;	      \
      (*(ppzv))->is_ref = 0;	      \
   }				      \
}

Was sagt das CangeLog?

1999-09-24  Zeev Suraski  <zeev_(at)_php.net>

    * ext/wddx/wddx.c
      ext/xml/xml.c
      ext/zlib/zlib.c: Compile fixes for WDDX, XML and Zlib (untested)

    * ext/sybase_ct/php_sybase_ct.c:
    This should make the Sybase CT module compile again (untested)

    * ext/msql/php_msql.c:
    This should make the mSQL module compile again (untested)

    * ext/mysql/php_mysql.c
      ChangeLog:
    Ok guys, the prototype for zend_fetch_resource*() has changed - it
now
    accepts a zval ** instead of a zval *, to be suitable for use with
the
    getParametersEx() API.
    You don't have to switch to the getParametersEx() API, but you will
have to
    go over your code and add &'s where it's applicable (of course, if
you have
    the mental strength to go over your code and convert it to use the
Ex API,
    it's best).

    The MySQL module now uses the getParametersEx() API completely.

Und was steht bei der Zend Funktion?

/* Zend-optimized Extended functions */
/* this function doesn't check for too many parameters */
ZEND_API int getParametersEx(int param_count,...)

Wenn Du mal den Source der beiden Funktionen in der zend_API.c
vergleichst, wirst Du sehen, daß die neue *Ex Funktion um ein ganzes
Stück kürzer geworden ist. Folgendes ist rausgeflogen:

  if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) {
    zval *new_tmp;
    new_tmp = (zval *) emalloc(sizeof(zval));
    *new_tmp = *param_ptr;
    zval_copy_ctor(new_tmp);
    INIT_PZVAL(new_tmp);
    param_ptr = new_tmp;
    ((zval *) *(p-param_count))->refcount--;
    *(p-param_count) = param_ptr;
  }
  *param = param_ptr;
  param_count--;
}

Frag mich nicht, was hier im Detail passiert... Wichtig scheint mir, daß
bei nur einer Stufe tiefer geschalteten Pointern kürzerer (s.
Extensions) und effektiverer Code möglich wird. Viele wichtige
Extensions (MySQL, Oracle, Standard-Array, Standard-String, ODBC...)
nutzen die neuen *Ex Funktionen, was die Vermutung stärkt, daß sie /*
Zend-optimized Extended functions */ sind.

Ulf


php::bar PHP Wiki   -   Listenarchive