2012-03-19 10 views
15

Mi sto dilettando con la creazione di a PHP extension per un progetto personale. Al di là di ciò che è collegato nell'articolo di cui sopra non ho conoscenza della zend_engine, e le mie abilità in C sono 10 anni non aggiornate, e sono state sempre solo accademiche. Tutto ciò è dire "Se sembra che io stia facendo una domanda stupida, probabilmente lo sono".Restituzione di oggetti PHP "nativi" da un interno

È possibile chiamare funzioni da altre estensioni PHP nella mia propria estensione, oppure ogni estensione PHP è considerata un'isola, senza informazioni su altre parti del sistema? Se questo è possibile, è una pratica comune o una cattiva idea ™?

Cioè, so che posso restituire una stringa con qualcosa di simile.

PHP_FUNCTION(hello_world) 
{ 
    char *str; 
    str = estrdup("Hello World"); 
    RETURN_STRING(str, 0); 
} 

Mi piacerebbe essere in grado di restituire, ad esempio, un elemento SimpleXML o un elemento DomDocument. Googling si è rivelato difficile, in quanto non vi è alcuna possibilità di sviluppo delle estensioni, e c'è un sacco di informazioni sull'uso standard di PHP.

+0

Bella domanda; Sarei sorpreso se la documentazione di Zend non facesse luce su questo. –

+1

@KerrekSB E questo è un bel RTFM :). Se tu (o qualcuno) conosci un documento zend che ha una buona panoramica di questo e non presuppone oltre 5 anni di esperienza di hacking di estensioni (o anche uno che lo fa) mi piacerebbe vederlo. –

risposta

4

Sì, le estensioni possono infatti dipendere dagli altri. Possono:

  • Utilizzare le risorse che altre estensioni si registrano a livello globale, come i tipi di classe o funzioni PHP (cioè, non hanno meno accesso di script utente-terra, che può ovviamente utilizzare tali risorse). Vedi zend_call_function e zend_lookup_class_ex.
  • Utilizzare qualsiasi simbolo e struttura esportati dichiarati nel file php_extensionname.h (queste intestazioni sono le uniche che sono considerate per esportare un'API nativa per altre estensioni). Tuttavia, alcune estensioni potrebbero infatti NON esportare alcuni simboli dichiarati in quei file di intestazione, è necessario cercare i simboli dichiarati con PHPAPI. Si noti che alcune estensioni non possono essere disattivate e si può fare affidamento sulla loro presenza (ad esempio, a partire da 5.3/5.4, standard, SPL, riflessione, data, pcre, ereg).
  • Se sia l'estensione che l'estensione di destinazione sono state create in modo statico, è possibile disporre di una maggiore latitudine sui simboli che è possibile utilizzare, ma non è una buona pratica utilizzare simboli non esportati.

Mi piacerebbe essere in grado di tornare, per esempio, un elemento SimpleXML, o un elemento di DomDocument.

Se è necessario creare un'istanza in modo esplicito un SimpleXMLElement o un DOMDocument, è possibile farlo con object_init_ex. Le estensioni di solito esportano il zend_class_entry * che deve passare quella macro, ma se non lo si può sempre usare zend_lookup_class_ex. Questo fa NON chiama il costruttore, quindi è necessario farlo manualmente se è necessario.

Alcune estensioni possono fornire un'interfaccia nativa per creare un'istanza e inizializzare un oggetto, ma in generale le estensioni non sono pronte ad avere altre estensioni che istanziano i loro tipi.

Naturalmente, è anche possibile, come uno script, richiamare funzioni e metodi PHP che restituiscono uno di questi tipi. Otterrai uno zval * che a sua volta potrai tornare dalla tua funzione.

Per quanto riguarda la dichiarazione delle dipendenze, il descrittore di estensione ha un entry per questo. Ciò garantirà che l'estensione venga caricata dopo quelle da cui dichiari di dipendere. Per dichiarare la dipendenza al momento della compilazione vedere PHP_ADD_EXTENSION_DEP.

2

Se stai scrivendo estensioni, allora Extending and Embedding PHP (ovvero "Libro di Sara") è una lettura essenziale. È un po 'datato ora, ma la migliore risorsa che troverai disponibile online o offline.