summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-09-15 13:57:53 -0700
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2013-09-15 13:57:53 -0700
commit9e1ecc534bace7d00a265a49018c0148a56361ae (patch)
treef7a779b999a7aed942510e3d448355f3554c20c7
parent9634a336f080bc15c1e67495eb9216d1863808f8 (diff)
Added Environment::call() method that makes it possible to call PHP functions
-rw-r--r--include/environment.h28
-rw-r--r--include/value.h5
-rw-r--r--phpcpp.h4
-rw-r--r--src/environment.cpp228
-rw-r--r--src/includes.h4
-rw-r--r--tests/simple/simple.cpp4
6 files changed, 268 insertions, 5 deletions
diff --git a/include/environment.h b/include/environment.h
index 6484d83..a7512d7 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -107,7 +107,33 @@ public:
*/
Global operator[](const std::string &name);
-
+ /**
+ * Call a function in PHP
+ * We have ten variants of this function, depending on the number of parameters
+ * @param name Name of the function
+ * @return Value
+ */
+ Value call(const Value &name);
+ Value call(const Value &name, Value p0);
+ Value call(const Value &name, Value p0, Value p1);
+ Value call(const Value &name, Value p0, Value p1, Value p2);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8);
+ Value call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9);
+
+private:
+ /**
+ * Call function with a number of parameters
+ * @param name Function name
+ * @param argc Number of parameters
+ * @param argv The parameters
+ * @return Value
+ */
+ Value exec(const Value &name, int argc, struct _zval_struct ***params);
protected:
/**
diff --git a/include/value.h b/include/value.h
index fa2b608..e29b8f2 100644
--- a/include/value.h
+++ b/include/value.h
@@ -492,6 +492,11 @@ protected:
* @var struct zval
*/
struct _zval_struct *_val;
+
+ /**
+ * The environment can access the zval directly
+ */
+ friend class Environment;
};
/**
diff --git a/phpcpp.h b/phpcpp.h
index f93081c..b0d4f48 100644
--- a/phpcpp.h
+++ b/phpcpp.h
@@ -21,13 +21,13 @@
/**
* Include all headers files that are related to this library
*/
-#include <phpcpp/hiddenpointer.h>
#include <phpcpp/type.h>
+#include <phpcpp/value.h>
+#include <phpcpp/hiddenpointer.h>
#include <phpcpp/environment.h>
#include <phpcpp/argument.h>
#include <phpcpp/byval.h>
#include <phpcpp/byref.h>
-#include <phpcpp/value.h>
#include <phpcpp/global.h>
#include <phpcpp/member.h>
#include <phpcpp/parameters.h>
diff --git a/src/environment.cpp b/src/environment.cpp
index b2fdad6..9b0a18e 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -64,6 +64,234 @@ Global Environment::operator[](const std::string &name)
}
/**
+ * Call function with a number of parameters
+ * @param name Function name
+ * @param argc Number of parameters
+ * @param argv The parameters
+ * @return Value
+ */
+Value Environment::exec(const Value &name, int argc, zval ***params)
+{
+ // the return zval
+ zval *retval = nullptr;
+
+ // call the function
+ if (call_user_function_ex(CG(function_table), NULL, name._val, &retval, argc, params, 1, NULL) != SUCCESS) return nullptr;
+
+ // was a value returned?
+ if (retval) return Value(retval);
+
+ // no value was returned, return NULL
+ return nullptr;
+}
+
+/**
+ * Call a function in PHP that does not have any parameters
+ * @param name Name of the function
+ * @return Value
+ */
+Value Environment::call(const Value &name)
+{
+ // call with zero parameters
+ return exec(name, 0, NULL);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0)
+{
+ // array of parameters
+ zval **params[1] = { &p0._val };
+
+ // call the function
+ return exec(name, 1, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1)
+{
+ // array of parameters
+ zval **params[2] = { &p0._val, &p1._val };
+
+ // call the function
+ return exec(name, 2, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2)
+{
+ // array of parameters
+ zval **params[3] = { &p0._val, &p1._val, &p2._val };
+
+ // call the function
+ return exec(name, 3, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3)
+{
+ // array of parameters
+ zval **params[4] = { &p0._val, &p1._val, &p2._val, &p3._val };
+
+ // call the function
+ return exec(name, 4, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4)
+{
+ // array of parameters
+ zval **params[5] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val };
+
+ // call the function
+ return exec(name, 5, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @param p5 The sixth parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5)
+{
+ // array of parameters
+ zval **params[6] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val };
+
+ // call the function
+ return exec(name, 6, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @param p5 The sixth parameter
+ * @param p6 The seventh parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6)
+{
+ // array of parameters
+ zval **params[7] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val };
+
+ // call the function
+ return exec(name, 7, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @param p5 The sixth parameter
+ * @param p6 The seventh parameter
+ * @param p7 The eight parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7)
+{
+ // array of parameters
+ zval **params[8] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val };
+
+ // call the function
+ return exec(name, 8, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @param p5 The sixth parameter
+ * @param p6 The seventh parameter
+ * @param p7 The eight parameter
+ * @param p8 The nineth parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8)
+{
+ // array of parameters
+ zval **params[9] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val, &p8._val };
+
+ // call the function
+ return exec(name, 9, params);
+}
+
+/**
+ * Call a function in PHP
+ * @param name Name of the function
+ * @param p0 The first parameter
+ * @param p1 The second parameter
+ * @param p2 The third parameter
+ * @param p3 The fourth parameter
+ * @param p4 The fifth parameter
+ * @param p5 The sixth parameter
+ * @param p6 The seventh parameter
+ * @param p7 The eight parameter
+ * @param p8 The nineth parameter
+ * @param p9 The tenth parameter
+ * @return Value
+ */
+Value Environment::call(const Value &name, Value p0, Value p1, Value p2, Value p3, Value p4, Value p5, Value p6, Value p7, Value p8, Value p9)
+{
+ // array of parameters
+ zval **params[10] = { &p0._val, &p1._val, &p2._val, &p3._val, &p4._val, &p5._val, &p6._val, &p7._val, &p8._val, &p9._val };
+
+ // call the function
+ return exec(name, 10, params);
+}
+
+/**
* End of namespace
*/
}
diff --git a/src/includes.h b/src/includes.h
index 7fb8c5f..41989c8 100644
--- a/src/includes.h
+++ b/src/includes.h
@@ -34,13 +34,13 @@
/**
* Include other files from this library
*/
-#include "../include/hiddenpointer.h"
#include "../include/type.h"
+#include "../include/value.h"
+#include "../include/hiddenpointer.h"
#include "../include/environment.h"
#include "../include/argument.h"
#include "../include/byval.h"
#include "../include/byref.h"
-#include "../include/value.h"
#include "../include/global.h"
#include "../include/member.h"
#include "../include/parameters.h"
diff --git a/tests/simple/simple.cpp b/tests/simple/simple.cpp
index dede458..fbc29d4 100644
--- a/tests/simple/simple.cpp
+++ b/tests/simple/simple.cpp
@@ -27,6 +27,10 @@ static Php::Value my_plus(Php::Environment &env, Php::Parameters &params)
g = "zo kan het ook";
+ string output = env.call("strtoupper","test in lowercase");
+
+ cout << "output: " << output << endl;
+
return p1 + p2;
}