[PHP] Add support for specifying any PHP interfaces a wrapped class
implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator";
This commit is contained in:
parent
e12322df86
commit
1a99212c2c
7 changed files with 79 additions and 0 deletions
|
|
@ -5,6 +5,10 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
Version 3.0.3 (in progress)
|
Version 3.0.3 (in progress)
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
2014-09-12: olly
|
||||||
|
[PHP] Add support for specifying any PHP interfaces a wrapped class
|
||||||
|
implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator";
|
||||||
|
|
||||||
2014-09-11: olly
|
2014-09-11: olly
|
||||||
[PHP] Fix throwing a PHP exception through C++ from a subclassed
|
[PHP] Fix throwing a PHP exception through C++ from a subclassed
|
||||||
director method - PHP NULL gets returned by the subclassed method
|
director method - PHP NULL gets returned by the subclassed method
|
||||||
|
|
|
||||||
|
|
@ -1416,6 +1416,7 @@
|
||||||
<li><a href="Php.html#Php_nn2_6_2">Constructors and Destructors</a>
|
<li><a href="Php.html#Php_nn2_6_2">Constructors and Destructors</a>
|
||||||
<li><a href="Php.html#Php_nn2_6_3">Static Member Variables</a>
|
<li><a href="Php.html#Php_nn2_6_3">Static Member Variables</a>
|
||||||
<li><a href="Php.html#Php_nn2_6_4">Static Member Functions</a>
|
<li><a href="Php.html#Php_nn2_6_4">Static Member Functions</a>
|
||||||
|
<li><a href="Php.html#Php_nn2_6_5">Specifying Implemented Interfaces</a>
|
||||||
</ul>
|
</ul>
|
||||||
<li><a href="Php.html#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
|
<li><a href="Php.html#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
<li><a href="#Php_nn2_6_2">Constructors and Destructors</a>
|
<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_3">Static Member Variables</a>
|
||||||
<li><a href="#Php_nn2_6_4">Static Member Functions</a>
|
<li><a href="#Php_nn2_6_4">Static Member Functions</a>
|
||||||
|
<li><a href="#Php_nn2_6_5">Specifying Implemented Interfaces</a>
|
||||||
</ul>
|
</ul>
|
||||||
<li><a href="#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
|
<li><a href="#Php_nn2_7">PHP Pragmas, Startup and Shutdown code</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
@ -770,6 +771,23 @@ Ko::threats();
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
|
|
||||||
|
<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>
|
<H3><a name="Php_nn2_7"></a>34.2.7 PHP Pragmas, Startup and Shutdown code</H3>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ top_srcdir = @top_srcdir@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
|
|
||||||
CPP_TEST_CASES += \
|
CPP_TEST_CASES += \
|
||||||
|
php_iterator \
|
||||||
php_namewarn_rename \
|
php_namewarn_rename \
|
||||||
|
|
||||||
include $(srcdir)/../common.mk
|
include $(srcdir)/../common.mk
|
||||||
|
|
|
||||||
24
Examples/test-suite/php/php_iterator_runme.php
Normal file
24
Examples/test-suite/php/php_iterator_runme.php
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require "tests.php";
|
||||||
|
require "php_iterator.php";
|
||||||
|
|
||||||
|
check::functions(array(myiterator_rewind,myiterator_key,myiterator_current,myiterator_next,myiterator_valid));
|
||||||
|
check::classes(array(MyIterator));
|
||||||
|
// No new global variables.
|
||||||
|
check::globals(array());
|
||||||
|
|
||||||
|
$s = '';
|
||||||
|
foreach (new MyIterator(1, 6) as $i) {
|
||||||
|
$s .= $i;
|
||||||
|
}
|
||||||
|
check::equal($s, '12345', 'Simple iteration failed');
|
||||||
|
|
||||||
|
$s = '';
|
||||||
|
foreach (new MyIterator(2, 5) as $k => $v) {
|
||||||
|
$s .= "($k=>$v)";
|
||||||
|
}
|
||||||
|
check::equal($s, '(0=>2)(1=>3)(2=>4)', 'Simple iteration failed');
|
||||||
|
|
||||||
|
check::done();
|
||||||
|
?>
|
||||||
20
Examples/test-suite/php_iterator.i
Normal file
20
Examples/test-suite/php_iterator.i
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* php_iterator.i - PHP-specific testcase for wrapping to a PHP Iterator */
|
||||||
|
%module php_iterator
|
||||||
|
|
||||||
|
%typemap("phpinterfaces") MyIterator "Iterator";
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
|
||||||
|
class MyIterator {
|
||||||
|
int i, from, to;
|
||||||
|
public:
|
||||||
|
MyIterator(int from_, int to_)
|
||||||
|
: i(from_), from(from_), to(to_) { }
|
||||||
|
void rewind() { i = from; }
|
||||||
|
bool valid() const { return i != to; }
|
||||||
|
int key() const { return i - from; }
|
||||||
|
int current() const { return i; }
|
||||||
|
void next() { ++i; }
|
||||||
|
};
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
@ -2045,6 +2045,17 @@ done:
|
||||||
} else if (GetFlag(n, "feature:exceptionclass")) {
|
} else if (GetFlag(n, "feature:exceptionclass")) {
|
||||||
Append(s_phpclasses, "extends Exception ");
|
Append(s_phpclasses, "extends Exception ");
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
Node *node = NewHash();
|
||||||
|
Setattr(node, "type", Getattr(n, "name"));
|
||||||
|
Setfile(node, Getfile(n));
|
||||||
|
Setline(node, Getline(n));
|
||||||
|
String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0);
|
||||||
|
if (interfaces) {
|
||||||
|
Printf(s_phpclasses, "implements %s ", interfaces);
|
||||||
|
}
|
||||||
|
Delete(node);
|
||||||
|
}
|
||||||
Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR);
|
Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR);
|
||||||
if (!baseclass) {
|
if (!baseclass) {
|
||||||
// Only store this in the base class (NB !baseclass means we *are*
|
// Only store this in the base class (NB !baseclass means we *are*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue