1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
<h1>Classes and objects</h1>
<p>
Serious business now. C++ and PHP are both object oriented programming
languages, in which you can create classes and objects. The PHP-CPP library
gives you the tools to combine these two and make a native C++ class
accessible from PHP.
</p>
<p>
Sadly (but also logically if you think about it) not every thinkable C++ class can be directly
exported to PHP. It takes a little more work (although not so much). For a
start, you must make sure that your class is derived from Php::Base, and
secondly, when you add your class to the extension object, you must also
specify all methods that you want to make accessible from PHP.
</p>
<p>
<pre class="language-c++"><code>
#include <phpcpp.h>
// actual class implementation
class Counter : public Php::Base
{
private:
int _value = 0;
public:
MyClass() {}
virtual ~MyClass() {}
Php::Value increment() { return ++_value; }
Php::Value decrement() { return --_value; }
Php::Value value() const { return _value; }
};
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("my_extension", "1.0");
// description of the class so that PHP knows which methods are accessible
Php::Class<Counter> counter("Counter");
counter.method("increment", &Counter::increment)
counter.method("decrement", &Counter::decrement)
counter.method("value", &Counter::value)
// add the class to the extension
myExtension.add(std::move(counter));
// return the extension
return myExtension;
}
}
</code></pre>
</p>
<p>
Let's talk about programming conventions first - I always use capitals for
the first letter of a classname, and my member variables always start with
an underscore. Every class always has a destructor, and it is always virtual.
That's just a convention - <i>my</i> convention - and you of course do not
have to follow that in your code.
</p>
<p>
On topic. The example shows a very simple Counter class with three methods:
increment(), decrement() and value(). The two update methods return the value
of the counter after the operation, the value() method returns the current value.
</p>
<p>
If you want to make a class method that is accessible from PHP, you must
ensure that is has one of the four supported signatures (which are the same
signatures that <a href="functions">exportable plain functions</a> can have):
</p>
<p>
<pre class="language-c++"><code>
void YourClass::example1();
void YourClass::example2(Php::Parameters &params);
Php::Value YourClass::example3();
Php::Value YourClass::example4(Php::Parameters &params);
</code></pre>
</p>
<p>
In the example we have used the third method form, a method that does
not take any parameters, and that returns a Php::Value object. The methods
work exactly the same as regular functions, with the difference that in
the methods you have (of course) access to the this pointer that refers to
the current object.
</p>
<p>
To make the class accessible from PHP, you must add it to the extension
object inside the get_module() function. The Php::Class object can be be used
for that. This is a templated class. The template parameter should be your
implementation class, so that the Php::Class object internally knows which
class to instantiate the moment the "new" operator is used inside a PHP script.
</p>
<p>
The Php::Class constructor receives a string parameter, with the name of
class in PHP. After you've created an instance of the Php::Class object,
you should specify all methods that you want to make accessible from PHP,
and finally, when all methods have been registered, you should add the
class to your extension object so that it will be accessible from PHP.
Note that in our example we have used the C++11 std::move function, so
that the class object is actually <i>moved</i> into the extension object,
which is a more efficient operation than copying.
</p>
|