C is a very low-level language by modern definitions. This means that it has
no built-in support for many features that PHP takes for granted, such as
reflection, dynamic module loading, bounds checking, threadsafe data
management and various useful data structures including linked lists and
hash tables. At the same time, C is a common denominator of language support
and functionality. Given enough work, none of these concepts are impossible;
the Zend Engine uses them all.
A lot of effort has gone into making the Zend API both extensible and
understandable, but C forces certain necessary declarations upon any
extension that to an inexperienced eye seem redundant or plain unnecessary.
All of those constructs, detailed in this section, are "write once and
forget" in Zend Engine 2 and 3. Here are some excerpts from the pregenerated
php_counter.h and counter.c files
created by PHP 5.3's ext_skel, showing the pregenerated
declarations:
extern zend_module_entry counter_module_entry;
#define phpext_counter_ptr &counter_module_entry
#ifdef PHP_WIN32
# define PHP_COUNTER_API __declspec(dllexport)
#elif defined(__GNUC__) && __GNUC__ >= 4
# define PHP_COUNTER_API __attribute__ ((visibility("default")))
#else
# define PHP_COUNTER_API
#endif
#ifdef ZTS
#include "TSRM.h"
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_counter.h"
/* ... */
#ifdef COMPILE_DL_COUNTER
ZEND_GET_MODULE(counter)
#endif