summaryrefslogtreecommitdiff
path: root/Doc/Manual/Php.html
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/Manual/Php.html')
-rw-r--r--Doc/Manual/Php.html110
1 files changed, 72 insertions, 38 deletions
diff --git a/Doc/Manual/Php.html b/Doc/Manual/Php.html
index 493c861f8..623adb68a 100644
--- a/Doc/Manual/Php.html
+++ b/Doc/Manual/Php.html
@@ -7,7 +7,7 @@
</head>
<body bgcolor="#ffffff">
-<H1><a name="Php"></a>33 SWIG and PHP</H1>
+<H1><a name="Php"></a>34 SWIG and PHP</H1>
<!-- INDEX -->
<div class="sectiontoc">
<ul>
@@ -29,6 +29,7 @@
<li><a href="#Php_nn2_6_2">Constructors and Destructors</a>
<li><a href="#Php_nn2_6_3">Static Member Variables</a>
<li><a href="#Php_nn2_6_4">Static Member Functions</a>
+<li><a href="#Php_nn2_6_5">Specifying Implemented Interfaces</a>
</ul>
<li><a href="#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
</ul>
@@ -79,7 +80,7 @@ your extension into php directly, you will need the complete PHP source tree
available.
</p>
-<H2><a name="Php_nn1"></a>33.1 Generating PHP Extensions</H2>
+<H2><a name="Php_nn1"></a>34.1 Generating PHP Extensions</H2>
<p>
@@ -113,9 +114,7 @@ more detail in <a href="#Php_nn2_6">section 27.2.6</a>.
<p>
The usual (and recommended) way is to build the extension as a separate
dynamically loaded module (which is supported by all modern operating
-systems). You can then specify that this be loaded
-automatically in <tt>php.ini</tt> or load it explicitly for any script which
-needs it.
+systems).
</p>
<p>
@@ -126,7 +125,7 @@ and it doesn't play nicely with package system. We don't recommend
this approach, or provide explicit support for it.
</p>
-<H3><a name="Php_nn1_1"></a>33.1.1 Building a loadable extension</H3>
+<H3><a name="Php_nn1_1"></a>34.1.1 Building a loadable extension</H3>
<p>
@@ -137,16 +136,16 @@ least work for Linux though):
</p>
<div class="code"><pre>
- gcc `php-config --includes` -fpic -c example_wrap.c
- gcc -shared example_wrap.o -o example.so
+ gcc `php-config --includes` -fpic -c example_wrap.c example.c
+ gcc -shared example_wrap.o example.o -o example.so
</pre></div>
-<H3><a name="Php_nn1_3"></a>33.1.2 Using PHP Extensions</H3>
+<H3><a name="Php_nn1_3"></a>34.1.2 Using PHP Extensions</H3>
<p>
-To test the extension from a PHP script, you need to load it first. You
-can load it for every script by adding this line to the <tt>[PHP]</tt> section of
+To test the extension from a PHP script, you first need to tell PHP to
+load it. To do this, add a line like this to the <tt>[PHP]</tt> section of
<tt>php.ini</tt>:
</p>
@@ -155,8 +154,14 @@ can load it for every script by adding this line to the <tt>[PHP]</tt> section o
</pre></div>
<p>
-Alternatively, you can load it explicitly only for scripts which need it
-by adding this line to the start of each such PHP script::
+If the module is in PHP's default extension directory, you can omit the path.
+</p>
+
+<p>
+For some SAPIs (for example, the CLI SAPI) you can instead use the
+<a href="http://php.net/manual/en/function.dl.php">dl() function</a> to load
+an extension at run time, by adding a like like this to the start of each
+PHP script which uses your extension:
</p>
<div class="code"><pre>
@@ -164,15 +169,26 @@ by adding this line to the start of each such PHP script::
</pre></div>
<p>
-SWIG also generates a php module, which
-attempts to do the <tt>dl()</tt> call for you:
+But note that this doesn't work when running PHP through a webserver in PHP5.3
+and later - you'll need to use <tt>extension</tt> in <tt>php.ini</tt> as
+described above.
+</p>
+
+<p>
+The PHP module which SWIG generates will also attempt to do the <tt>dl()</tt>
+call for you if the extension isn't already loaded:
</p>
<div class="code"><pre>
include("example.php");
</pre></div>
-<H2><a name="Php_nn2"></a>33.2 Basic PHP interface</H2>
+<p>
+This PHP module also defines the PHP classes for the wrapped API, so you'll
+almost certainly want to include it anyway.
+</p>
+
+<H2><a name="Php_nn2"></a>34.2 Basic PHP interface</H2>
<p>
@@ -183,7 +199,7 @@ other symbols unless care is taken to <tt>%rename</tt> them. At present
SWIG doesn't have support for the namespace feature added in PHP 5.3.
</p>
-<H3><a name="Php_nn2_1"></a>33.2.1 Constants</H3>
+<H3><a name="Php_nn2_1"></a>34.2.1 Constants</H3>
<p>
@@ -220,9 +236,9 @@ echo "E = " . E . "\n";
<p>
There's one peculiarity of how constants work in PHP which it is useful
to note (this is not specific to SWIG though) - if you try to use an undeclared
-constant, PHP will issue a warning and then expand the constant to a string
-version of the constant's name. The warning will often be missed though as
-if you're using PHP in a webserver, it will probably end up in error.log or
+constant, PHP will emit a notice and then expand the constant to a string
+version of the constant's name. Unfortunately it is easy to miss the notice
+if you're using PHP in a webserver, as it will probably end up in error.log or
similar.
</p>
@@ -260,7 +276,7 @@ is treated as true by the if test, when the value of the intended constant
would be treated as false!
</p>
-<H3><a name="Php_nn2_2"></a>33.2.2 Global Variables</H3>
+<H3><a name="Php_nn2_2"></a>34.2.2 Global Variables</H3>
<p>
@@ -309,7 +325,7 @@ undefined.
At this time SWIG does not support custom accessor methods.
</p>
-<H3><a name="Php_nn2_3"></a>33.2.3 Functions</H3>
+<H3><a name="Php_nn2_3"></a>34.2.3 Functions</H3>
<p>
@@ -362,7 +378,7 @@ print $s; # The value of $s was not changed.
-->
-<H3><a name="Php_nn2_4"></a>33.2.4 Overloading</H3>
+<H3><a name="Php_nn2_4"></a>34.2.4 Overloading</H3>
<p>
@@ -418,7 +434,7 @@ taking the integer argument.
</p>
-->
-<H3><a name="Php_nn2_5"></a>33.2.5 Pointers and References</H3>
+<H3><a name="Php_nn2_5"></a>34.2.5 Pointers and References</H3>
<p>
@@ -563,7 +579,7 @@ PHP in a number of ways: by using <tt>unset</tt> on an existing
variable, or assigning <tt>NULL</tt> to a variable.
</p>
-<H3><a name="Php_nn2_6"></a>33.2.6 Structures and C++ classes</H3>
+<H3><a name="Php_nn2_6"></a>34.2.6 Structures and C++ classes</H3>
<p>
@@ -624,7 +640,7 @@ Would be used in the following way from PHP5:
Member variables and methods are accessed using the <tt>-&gt;</tt> operator.
</p>
-<H4><a name="Php_nn2_6_1"></a>33.2.6.1 Using <tt>-noproxy</tt></H4>
+<H4><a name="Php_nn2_6_1"></a>34.2.6.1 Using <tt>-noproxy</tt></H4>
<p>
@@ -650,7 +666,7 @@ Complex_im_set($obj,$d);
Complex_im_get($obj);
</pre></div>
-<H4><a name="Php_nn2_6_2"></a>33.2.6.2 Constructors and Destructors</H4>
+<H4><a name="Php_nn2_6_2"></a>34.2.6.2 Constructors and Destructors</H4>
<p>
@@ -691,7 +707,7 @@ the programmer can either reassign the variable or call
<tt>unset($v)</tt>
</p>
-<H4><a name="Php_nn2_6_3"></a>33.2.6.3 Static Member Variables</H4>
+<H4><a name="Php_nn2_6_3"></a>34.2.6.3 Static Member Variables</H4>
<p>
@@ -734,7 +750,7 @@ Ko::threats(10);
echo "There have now been " . Ko::threats() . " threats\n";
</pre></div>
-<H4><a name="Php_nn2_6_4"></a>33.2.6.4 Static Member Functions</H4>
+<H4><a name="Php_nn2_6_4"></a>34.2.6.4 Static Member Functions</H4>
<p>
@@ -756,7 +772,25 @@ Ko::threats();
</pre></div>
-<H3><a name="Php_nn2_7"></a>33.2.7 PHP Pragmas, Startup and Shutdown code</H3>
+<H4><a name="Php_nn2_6_5"></a>34.2.6.5 Specifying Implemented Interfaces</H4>
+
+
+<p>
+PHP supports the concept of abstract interfaces which a class can implement.
+Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example
+<code>MyIterator</code>) implements the <code>Iterator</code> interface like
+so:
+</p>
+
+<div class="code"><pre>
+%typemap("phpinterfaces") MyIterator "Iterator";
+</pre></div>
+
+<p>
+If there are multiple interfaces, just list them separated by commas.
+</p>
+
+<H3><a name="Php_nn2_7"></a>34.2.7 PHP Pragmas, Startup and Shutdown code</H3>
<p>
@@ -844,7 +878,7 @@ The <tt>%rinit</tt> and <tt>%rshutdown</tt> statements are very similar but inse
into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.
</p>
-<H2><a name="Php_nn3"></a>33.3 Cross language polymorphism</H2>
+<H2><a name="Php_nn3"></a>34.3 Cross language polymorphism</H2>
<p>
@@ -879,7 +913,7 @@ wrapper functions takes care of all the cross-language method routing
transparently.
</p>
-<H3><a name="Php_nn3_1"></a>33.3.1 Enabling directors</H3>
+<H3><a name="Php_nn3_1"></a>34.3.1 Enabling directors</H3>
<p>
@@ -968,7 +1002,7 @@ class MyFoo extends Foo {
</div>
-<H3><a name="Php_nn3_2"></a>33.3.2 Director classes</H3>
+<H3><a name="Php_nn3_2"></a>34.3.2 Director classes</H3>
@@ -1048,7 +1082,7 @@ so there is no need for the extra overhead involved with routing the
calls through PHP.
</p>
-<H3><a name="Php_nn3_3"></a>33.3.3 Ownership and object destruction</H3>
+<H3><a name="Php_nn3_3"></a>34.3.3 Ownership and object destruction</H3>
<p>
@@ -1104,7 +1138,7 @@ In this example, we are assuming that FooContainer will take care of
deleting all the Foo pointers it contains at some point.
</p>
-<H3><a name="Php_nn3_4"></a>33.3.4 Exception unrolling</H3>
+<H3><a name="Php_nn3_4"></a>34.3.4 Exception unrolling</H3>
<p>
@@ -1163,7 +1197,7 @@ Swig::DirectorMethodException is thrown, PHP will register the exception
as soon as the C wrapper function returns.
</p>
-<H3><a name="Php_nn3_5"></a>33.3.5 Overhead and code bloat</H3>
+<H3><a name="Php_nn3_5"></a>34.3.5 Overhead and code bloat</H3>
<p>
@@ -1196,7 +1230,7 @@ optimized by selectively enabling director methods (using the %feature
directive) for only those methods that are likely to be extended in PHP.
</p>
-<H3><a name="Php_nn3_6"></a>33.3.6 Typemaps</H3>
+<H3><a name="Php_nn3_6"></a>34.3.6 Typemaps</H3>
<p>
@@ -1210,7 +1244,7 @@ need to be supported.
</p>
-<H3><a name="Php_nn3_7"></a>33.3.7 Miscellaneous</H3>
+<H3><a name="Php_nn3_7"></a>34.3.7 Miscellaneous</H3>
<p> Director typemaps for STL classes are mostly in place, and hence you