summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile44
-rw-r--r--common/includes.h1
-rw-r--r--include/argument.h37
-rw-r--r--include/array.h31
-rw-r--r--include/arrayaccess.h19
-rw-r--r--include/base.h85
-rw-r--r--include/byref.h3
-rw-r--r--include/byval.h3
-rw-r--r--include/call.h122
-rw-r--r--include/class.h129
-rw-r--r--include/classbase.h39
-rw-r--r--include/classtype.h8
-rw-r--r--include/constant.h27
-rw-r--r--include/countable.h13
-rw-r--r--include/exception.h22
-rw-r--r--include/extension.h64
-rw-r--r--include/fatalerror.h21
-rw-r--r--include/file.h31
-rw-r--r--include/function.h35
-rw-r--r--include/global.h36
-rw-r--r--include/globals.h17
-rw-r--r--include/hashmember.h89
-rw-r--r--include/hashparent.h31
-rw-r--r--include/ini.h27
-rw-r--r--include/inivalue.h23
-rw-r--r--include/interface.h11
-rw-r--r--include/iterator.h24
-rw-r--r--include/modifiers.h18
-rw-r--r--include/namespace.h69
-rw-r--r--include/object.h42
-rw-r--r--include/parameters.h13
-rw-r--r--include/script.h28
-rw-r--r--include/serializable.h11
-rw-r--r--include/streams.h10
-rw-r--r--include/super.h21
-rw-r--r--include/traversable.h2
-rw-r--r--include/type.h3
-rw-r--r--include/value.h4
-rw-r--r--include/valueiterator.h23
-rw-r--r--include/version.h4
-rw-r--r--include/visibility.h30
-rw-r--r--phpcpp.h11
-rw-r--r--zend/hiddenpointer.h (renamed from include/hiddenpointer.h)1
-rw-r--r--zend/includes.h3
44 files changed, 635 insertions, 650 deletions
diff --git a/Makefile b/Makefile
index b5a5277..c04f50a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,11 @@
#
# PHP-CPP Makefile
#
-# This makefile has a user friendly order: the top part of this file contains
+# This makefile has a user friendly order: the top part of this file contains
# all variable settings that you may alter to suit your own system, while at
# the bottom you will find instructions for the compiler in which you will
# probably not have to make any changes
-#
+#
#
# Php-config utility
@@ -13,9 +13,9 @@
# PHP comes with a standard utility program called 'php-config'. This program
# can be used to find out in which directories PHP is installed. Inside this
# makefile this utility program is used to find include directories, shared
-# libraries and the path to the binary file. If your php-config is not
+# libraries and the path to the binary file. If your php-config is not
# installed in the default directory, you can change that here.
-#
+#
PHP_CONFIG = php-config
@@ -35,12 +35,12 @@ PHP_BIN = $(shell ${PHP_CONFIG} --php-binary)
#
# Installation directory
#
-# When you install the PHP-CPP library, it will place a number of C++ *.h
+# When you install the PHP-CPP library, it will place a number of C++ *.h
# header files in your system include directory, and a libphpcpp.so shared
# library file in your system libraries directory. Most users set this to
# the regular /usr/include and /usr/lib directories, or /usr/local/include
# and /usr/local/lib. You can of course change it to whatever suits you best
-#
+#
INSTALL_PREFIX = /usr
INSTALL_HEADERS = ${INSTALL_PREFIX}/include
@@ -65,7 +65,7 @@ HHVM_STATIC_LIBRARY = libhhvmcpp.a
# Compiler
#
# By default, the GNU C++ compiler is used. If you want to use a different
-# compiler, you can change that here. You can change this for both the
+# compiler, you can change that here. You can change this for both the
# compiler (the program that turns the c++ files into object files) and for
# the linker (the program that links all object files into a single .so
# library file. By default, g++ (the GNU C++ compiler) is used for both.
@@ -88,16 +88,16 @@ endif
#
# Compiler flags
#
-# This variable holds the flags that are passed to the compiler. By default,
-# we include the -O2 flag. This flag tells the compiler to optimize the code,
-# but it makes debugging more difficult. So if you're debugging your application,
-# you probably want to remove this -O2 flag. At the same time, you can then
+# This variable holds the flags that are passed to the compiler. By default,
+# we include the -O2 flag. This flag tells the compiler to optimize the code,
+# but it makes debugging more difficult. So if you're debugging your application,
+# you probably want to remove this -O2 flag. At the same time, you can then
# add the -g flag to instruct the compiler to include debug information in
# the library (but this will make the final libphpcpp.so file much bigger, so
# you want to leave that flag out on production servers).
#
-COMPILER_FLAGS = -Wall -c -g -std=c++11
+COMPILER_FLAGS = -Wall -c -g -std=c++11 -fvisibility=hidden -DBUILDING_PHPCPP
SHARED_COMPILER_FLAGS = -fpic
STATIC_COMPILER_FLAGS =
PHP_COMPILER_FLAGS = ${COMPILER_FLAGS} `${PHP_CONFIG} --includes`
@@ -121,7 +121,7 @@ HHVM_LINKER_FLAGS = ${LINKER_FLAGS}
#
# Command to remove files, copy files and create directories.
#
-# I've never encountered a *nix environment in which these commands do not work.
+# I've never encountered a *nix environment in which these commands do not work.
# So you can probably leave this as it is
#
@@ -134,7 +134,7 @@ MKDIR = mkdir -p
# The source files
#
# For this we use a special Makefile function that automatically scans the
-# common/, zend/ and hhvm/ directories for all *.cpp files. No changes are
+# common/, zend/ and hhvm/ directories for all *.cpp files. No changes are
# probably necessary here
#
@@ -146,8 +146,8 @@ HHVM_SOURCES = $(wildcard hhvm/*.cpp)
# The object files
#
# The intermediate object files are generated by the compiler right before
-# the linker turns all these object files into the libphpcpp.so and
-# libhhvmcpp.so shared libraries. We also use a Makefile function here that
+# the linker turns all these object files into the libphpcpp.so and
+# libhhvmcpp.so shared libraries. We also use a Makefile function here that
# takes all source files.
#
@@ -201,22 +201,22 @@ clean:
${RM} static ${PHP_STATIC_LIBRARY} ${HHVM_STATIC_LIBRARY}
find -name *.o | xargs ${RM}
-${COMMON_SHARED_OBJECTS}:
+${COMMON_SHARED_OBJECTS}:
${COMPILER} ${COMPILER_FLAGS} ${SHARED_COMPILER_FLAGS} -o $@ ${@:shared/%.o=%.cpp}
-${COMMON_STATIC_OBJECTS}:
+${COMMON_STATIC_OBJECTS}:
${COMPILER} ${COMPILER_FLAGS} ${STATIC_COMPILER_FLAGS} -o $@ ${@:static/%.o=%.cpp}
-${PHP_SHARED_OBJECTS}:
+${PHP_SHARED_OBJECTS}:
${COMPILER} ${PHP_COMPILER_FLAGS} ${SHARED_COMPILER_FLAGS} -o $@ ${@:shared/%.o=%.cpp}
-${PHP_STATIC_OBJECTS}:
+${PHP_STATIC_OBJECTS}:
${COMPILER} ${PHP_COMPILER_FLAGS} ${STATIC_COMPILER_FLAGS} -o $@ ${@:static/%.o=%.cpp}
-${HHVM_SHARED_OBJECTS}:
+${HHVM_SHARED_OBJECTS}:
${COMPILER} ${HHVM_COMPILER_FLAGS} ${SHARED_COMPILER_FLAGS} -o $@ ${@:shared/%.o=%.cpp}
-${HHVM_STATIC_OBJECTS}:
+${HHVM_STATIC_OBJECTS}:
${COMPILER} ${HHVM_COMPILER_FLAGS} ${STATIC_COMPILER_FLAGS} -o $@ ${@:static/%.o=%.cpp}
install:
diff --git a/common/includes.h b/common/includes.h
index db29f10..437f73e 100644
--- a/common/includes.h
+++ b/common/includes.h
@@ -15,6 +15,7 @@
/**
* Public include files
*/
+#include "../include/visibility.h"
#include "../include/modifiers.h"
/**
diff --git a/include/argument.h b/include/argument.h
index f45a43a..747f7a8 100644
--- a/include/argument.h
+++ b/include/argument.h
@@ -6,7 +6,7 @@
*
* The constructor of the argument is protected. Use the ByVal or ByRef
* classes instead.
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2013, 2014 Copernica BV
*/
@@ -19,14 +19,14 @@ namespace Php {
/**
* Class definition
*/
-class Argument
+class PHPCPP_EXPORT Argument
{
public:
/**
* Destructor
*/
virtual ~Argument() {}
-
+
protected:
/**
* Constructor
@@ -35,9 +35,9 @@ protected:
* @param required Is this argument required?
* @param byref Is this a reference argument
*/
- Argument(const char *name, Type type, bool required = true, bool byref = false) :
+ Argument(const char *name, Type type, bool required = true, bool byref = false) :
_name(name), _type(type), _required(required), _byReference(byref) {}
-
+
/**
* Constructor
* @param name Name of the argument
@@ -48,7 +48,7 @@ protected:
*/
Argument(const char *name, const char *classname, bool nullable = true, bool required = true, bool byref = false) :
_name(name), _type(Type::Object), _classname(classname), _nullable(nullable), _required(required), _byReference(byref) {}
-
+
public:
/**
* Is this a required argument?
@@ -59,7 +59,7 @@ public:
{
return _required;
}
-
+
/**
* Name of the argument
* @return const char *
@@ -68,8 +68,8 @@ public:
{
return _name;
}
-
- /**
+
+ /**
* Type-hint for the argument
* @return Type
*/
@@ -77,7 +77,7 @@ public:
{
return _type;
}
-
+
/**
* If the type is a class, the name of the class
* @return const char *
@@ -86,7 +86,7 @@ public:
{
return _classname;
}
-
+
/**
* Is it allowed to pass parameter with a null value?
* @return bool
@@ -95,7 +95,7 @@ public:
{
return _nullable;
}
-
+
/**
* Is this a parameter-by-reference?
* @return bool
@@ -104,14 +104,14 @@ public:
{
return _byReference;
}
-
+
private:
/**
* Name of the argument
* @var const char *
*/
const char *_name = nullptr;
-
+
/**
* Type of argument
* @var Type
@@ -123,7 +123,7 @@ private:
* @var std::string
*/
const char *_classname = nullptr;
-
+
/**
* May the parameter be null?
* @var bool
@@ -135,7 +135,7 @@ private:
* @var bool
*/
bool _required = true;
-
+
/**
* Is this a 'by-reference' parameter?
* @var bool
@@ -156,7 +156,7 @@ using Arguments = std::vector<Argument>;
/**
* Other compilers, and visual C++ 2013 do support initializer lists
*/
-#else
+#else
/**
* A list of arguments can be supplied to methods
@@ -169,9 +169,8 @@ using Arguments = std::initializer_list<Argument>;
*/
#endif
-
+
/**
* End of namespace
*/
}
-
diff --git a/include/array.h b/include/array.h
index 02fe4c4..c4250d4 100644
--- a/include/array.h
+++ b/include/array.h
@@ -1,7 +1,7 @@
/**
* Array.h
*
- * The Array is a wrapper around the value class that ensures that a
+ * The Array is a wrapper around the value class that ensures that a
* certain property always is an array
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
@@ -16,19 +16,19 @@ namespace Php {
/**
* Class definition
*/
-class Array : public Value
+class PHPCPP_EXPORT Array : public Value
{
public:
/**
* Constructor
*/
Array() : Value(Type::Array) {}
-
+
/**
* Copy constructor from a value object
* @param value
*/
- Array(const Value &value) : Value(value)
+ Array(const Value &value) : Value(value)
{
// type must be valid
if (value.type() != Type::Array) throw FatalError("Assigning a non-array to an array variable");
@@ -50,7 +50,7 @@ public:
*/
template <typename T>
Array(const std::vector<T> &input) : Value(input) {}
-
+
/**
* Constructor from a map (this will create an associative array)
* @param value
@@ -68,8 +68,8 @@ public:
Array(const std::initializer_list<Value> &value) : Value(value) {}
// end of visual c++ check
-# endif
-
+# endif
+
/**
* Destructor
*/
@@ -83,11 +83,11 @@ public:
{
// throw exception if things are going wrong
if (type != Type::Array) throw FatalError("Changing type of a fixed array variable");
-
+
// call base
return Value::setType(Type::Array);
}
-
+
/**
* Assignment operator
* @param value
@@ -97,17 +97,17 @@ public:
{
// skip self assignment
if (this == &value) return *this;
-
+
// type must be valid
if (value.type() != Type::Array) throw FatalError("Assigning a non-array to a fixed array variable");
-
+
// call base
Value::operator=(value);
// done
return *this;
}
-
+
/**
* Move assignment operator
* @param value
@@ -117,13 +117,13 @@ public:
{
// skip self assignment
if (this == &value) return *this;
-
+
// type must be valid
if (value.type() != Type::Array) throw FatalError("Moving a non-array to a fixed array variable");
-
+
// call base
Value::operator=(std::move(value));
-
+
// done
return *this;
}
@@ -133,4 +133,3 @@ public:
* End of namespace
*/
}
-
diff --git a/include/arrayaccess.h b/include/arrayaccess.h
index cf8c261..4cb936f 100644
--- a/include/arrayaccess.h
+++ b/include/arrayaccess.h
@@ -1,11 +1,11 @@
/**
* ArrayAccess.h
- *
+ *
* "Interface" that can be "implemented" by your class. If you do, you
* create your class like this:
- *
+ *
* class MyClass : public Php::Base, public Php::ArrayAccess { ... }
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2014 Copernica BV
*/
@@ -14,11 +14,11 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Class definition
*/
-class ArrayAccess
+class PHPCPP_EXPORT ArrayAccess
{
public:
/**
@@ -27,30 +27,29 @@ public:
* @return bool
*/
virtual bool offsetExists(const Php::Value &key) = 0;
-
+
/**
* Set a member
* @param key
* @param value
*/
virtual void offsetSet(const Php::Value &key, const Php::Value &value) = 0;
-
+
/**
* Retrieve a member
* @param key
* @return value
*/
virtual Php::Value offsetGet(const Php::Value &key) = 0;
-
+
/**
* Remove a member
* @param key
*/
virtual void offsetUnset(const Php::Value &key) = 0;
};
-
+
/**
* End namespace
*/
}
-
diff --git a/include/base.h b/include/base.h
index 417aef0..1a1643b 100644
--- a/include/base.h
+++ b/include/base.h
@@ -19,7 +19,7 @@ class ObjectImpl;
/**
* Class definition
*/
-class Base
+class PHPCPP_EXPORT Base
{
private:
/**
@@ -27,7 +27,7 @@ private:
* @var ObjectImpl
*/
ObjectImpl *_impl = nullptr;
-
+
protected:
/**
* Constructor
@@ -36,16 +36,16 @@ protected:
/**
* Copy constructor
- *
+ *
* This copy constructor is explicitly defined to make sure that the
* copied object does not already have an implementation in the zend engine.
* Otherwise the copied object has the same object handle as the original
* object.
- *
+ *
* @param base
*/
Base(const Base &base) : _impl(nullptr) {}
-
+
public:
/**
* Virtual destructor
@@ -71,7 +71,7 @@ public:
{
return Value(this)[name];
}
-
+
/**
* Retrieve a property by name
* @param string
@@ -81,7 +81,7 @@ public:
{
return Value(this)[name];
}
-
+
/**
* Retrieve a property by name
* @param string
@@ -111,7 +111,7 @@ public:
{
return Value(this).get(name);
}
-
+
/**
* Retrieve a property by name
* @param string
@@ -121,7 +121,7 @@ public:
{
return Value(this).get(name);
}
-
+
/**
* Retrieve a property by name
* @param string
@@ -131,7 +131,7 @@ public:
{
return Value(this).get(name);
}
-
+
/**
* Overridable method that is called right before an object is destructed
*/
@@ -139,61 +139,61 @@ public:
/**
* Overridable method that is called right after an object is cloned
- *
+ *
* The default implementation does nothing
*/
void __clone() const {}
-
+
/**
* Overridable method that is called to check if a property is set
- *
+ *
* The default implementation does nothing, and the script will fall back
* to accessing the regular object properties
- *
+ *
* @param key
* @return bool
*/
bool __isset(const Php::Value &key) const;
-
+
/**
* Overridable method that is called to set a new property
- *
+ *
* The default implementation does nothing, and the script will fall back
* to accessing the regular object properties
- *
+ *
* @param key
* @param value
*/
void __set(const Php::Value &key, const Php::Value &value) const;
-
+
/**
* Retrieve a property
- *
+ *
* The default implementation does nothing, and the script will fall back
* to accessing the regular object properties
- *
+ *
* @param key
* @return value
*/
Php::Value __get(const Php::Value &key) const;
-
+
/**
* Remove a member
- *
+ *
* The default implementation does nothing, and the script will fall back
* to accessing the regular object properties
- *
+ *
* @param key
*/
void __unset(const Php::Value &key) const;
/**
* Call a method
- *
+ *
* This method is called when a method is called from the PHP script that
* was not explicitly defined. You can use this to catch variable method
* names, or to support all thinkable method names.
- *
+ *
* @param method Name of the method that was called
* @param params The parameters that were passed to the function
* @return Value The return value
@@ -202,65 +202,65 @@ public:
/**
* Call the class as if it was a function
- *
+ *
* This method is called when a an object is used with () operators:
* $object(). You can override this method to make objects callable.
- *
+ *
* @param params The parameters that were passed to the function
* @return Value The return value
*/
Php::Value __invoke(Php::Parameters &params) const;
-
+
/**
* Cast the object to a string
- *
+ *
* This method is called when an object is casted to a string, or when
* it is used in a string context
- *
+ *
* @return Value The object as a string
*/
Php::Value __toString() const;
-
+
/**
* Cast the object to an integer
- *
+ *
* This method is called when an object is casted to an integer, or when
* it is used in an integer context
- *
+ *
* @return int Integer value
*/
Php::Value __toInteger() const;
-
+
/**
* Cast the object to a float
- *
+ *
* This method is called when an object is casted to a float, or when it
* is used in a float context
- *
+ *
* @return double Floating point value
*/
Php::Value __toFloat() const;
-
+
/**
* Cast the object to a boolean
- *
+ *
* This method is called when an object is casted to a bool, or when it
* is used in a boolean context
- *
+ *
* @return bool
*/
Value __toBool() const;
/**
* Compare the object with a different object
- *
+ *
* Check how a different object compares to this object
- *
+ *
* @param that Object to compare with
* @return int
*/
int __compare(const Base &base) const;
-
+
private:
/**
@@ -284,4 +284,3 @@ private:
* End of namespace
*/
}
-
diff --git a/include/byref.h b/include/byref.h
index 07e2e21..8d38077 100644
--- a/include/byref.h
+++ b/include/byref.h
@@ -15,7 +15,7 @@ namespace Php {
/**
* Class definition
*/
-class ByRef : public Argument
+class PHPCPP_EXPORT ByRef : public Argument
{
public:
/**
@@ -57,4 +57,3 @@ public:
* End of namespace
*/
}
-
diff --git a/include/byval.h b/include/byval.h
index 38c5280..ad0126b 100644
--- a/include/byval.h
+++ b/include/byval.h
@@ -15,7 +15,7 @@ namespace Php {
/**
* Class definition
*/
-class ByVal : public Argument
+class PHPCPP_EXPORT ByVal : public Argument
{
public:
/**
@@ -57,4 +57,3 @@ public:
* End of namespace
*/
}
-
diff --git a/include/call.h b/include/call.h
index e339ece..36574ce 100644
--- a/include/call.h
+++ b/include/call.h
@@ -15,38 +15,38 @@ namespace Php {
/**
* List of functions that are available for use in PHP
*/
-extern bool class_exists(const char *classname, size_t size, bool autoload = true);
-inline bool class_exists(const char *classname, bool autoload = true) { return class_exists(classname, strlen(classname), autoload); }
-inline bool class_exists(const std::string &classname, bool autoload = true) { return class_exists(classname.c_str(), classname.size(), autoload); }
-extern Value constant(const char *constant);
-extern Value constant(const char *constant, size_t size);
-extern Value constant(const std::string &constant);
-extern bool define(const char *name, size_t size, const Value &value);
-extern bool define(const char *name, const Value &value);
-extern bool define(const std::string &name, const Value &value);
-extern bool defined(const char *constant);
-extern bool defined(const char *constant, size_t size);
-extern bool defined(const std::string &constant);
-extern bool dl(const char *filename);
-inline bool dl(const std::string &filename) { return dl(filename.c_str()); }
-inline bool dl(const Value &filename) { return dl(filename.rawValue()); }
-extern Value eval(const char *phpCode);
-inline Value eval(const std::string &phpCode) { return eval(phpCode.c_str()); }
-extern Value include(const char *filename);
-inline Value include(const std::string &filename) { return include(filename.c_str()); }
-extern Value include_once(const char *filename);
-inline Value include_once(const std::string &filename) { return include_once(filename.c_str()); }
-inline bool is_a(const Value &obj, const char *classname, size_t size, bool allow_string = false) { return obj.instanceOf(classname, size, allow_string); }
-inline bool is_a(const Value &obj, const char *classname, bool allow_string = false) { return is_a(obj, classname, strlen(classname), allow_string); }
-inline bool is_a(const Value &obj, const std::string &classname, bool allow_string = false) { return is_a(obj, classname.c_str(), classname.size(), allow_string); }
-inline bool is_subclass_of(const Value &obj, const char *classname, size_t size, bool allow_string = true) { return obj.derivedFrom(classname, size, allow_string); }
-inline bool is_subclass_of(const Value &obj, const char *classname, bool allow_string = true) { return is_subclass_of(obj, classname, strlen(classname), allow_string); }
-inline bool is_subclass_of(const Value &obj, const std::string &classname, bool allow_string = true) { return is_subclass_of(obj, classname.c_str(), classname.size(), allow_string); }
-extern Value require(const char *filename);
-inline Value require(const std::string &filename) { return require(filename.c_str()); }
-extern Value require_once(const char *filename);
-inline Value require_once(const std::string &filename) { return require_once(filename.c_str()); }
-extern const char *sapi_name();
+extern PHPCPP_EXPORT bool class_exists(const char *classname, size_t size, bool autoload = true);
+inline PHPCPP_EXPORT bool class_exists(const char *classname, bool autoload = true) { return class_exists(classname, strlen(classname), autoload); }
+inline PHPCPP_EXPORT bool class_exists(const std::string &classname, bool autoload = true) { return class_exists(classname.c_str(), classname.size(), autoload); }
+extern PHPCPP_EXPORT Value constant(const char *constant);
+extern PHPCPP_EXPORT Value constant(const char *constant, size_t size);
+extern PHPCPP_EXPORT Value constant(const std::string &constant);
+extern PHPCPP_EXPORT bool define(const char *name, size_t size, const Value &value);
+extern PHPCPP_EXPORT bool define(const char *name, const Value &value);
+extern PHPCPP_EXPORT bool define(const std::string &name, const Value &value);
+extern PHPCPP_EXPORT bool defined(const char *constant);
+extern PHPCPP_EXPORT bool defined(const char *constant, size_t size);
+extern PHPCPP_EXPORT bool defined(const std::string &constant);
+extern PHPCPP_EXPORT bool dl(const char *filename);
+inline PHPCPP_EXPORT bool dl(const std::string &filename) { return dl(filename.c_str()); }
+inline PHPCPP_EXPORT bool dl(const Value &filename) { return dl(filename.rawValue()); }
+extern PHPCPP_EXPORT Value eval(const char *phpCode);
+inline PHPCPP_EXPORT Value eval(const std::string &phpCode) { return eval(phpCode.c_str()); }
+extern PHPCPP_EXPORT Value include(const char *filename);
+inline PHPCPP_EXPORT Value include(const std::string &filename) { return include(filename.c_str()); }
+extern PHPCPP_EXPORT Value include_once(const char *filename);
+inline PHPCPP_EXPORT Value include_once(const std::string &filename) { return include_once(filename.c_str()); }
+inline PHPCPP_EXPORT bool is_a(const Value &obj, const char *classname, size_t size, bool allow_string = false) { return obj.instanceOf(classname, size, allow_string); }
+inline PHPCPP_EXPORT bool is_a(const Value &obj, const char *classname, bool allow_string = false) { return is_a(obj, classname, strlen(classname), allow_string); }
+inline PHPCPP_EXPORT bool is_a(const Value &obj, const std::string &classname, bool allow_string = false) { return is_a(obj, classname.c_str(), classname.size(), allow_string); }
+inline PHPCPP_EXPORT bool is_subclass_of(const Value &obj, const char *classname, size_t size, bool allow_string = true) { return obj.derivedFrom(classname, size, allow_string); }
+inline PHPCPP_EXPORT bool is_subclass_of(const Value &obj, const char *classname, bool allow_string = true) { return is_subclass_of(obj, classname, strlen(classname), allow_string); }
+inline PHPCPP_EXPORT bool is_subclass_of(const Value &obj, const std::string &classname, bool allow_string = true) { return is_subclass_of(obj, classname.c_str(), classname.size(), allow_string); }
+extern PHPCPP_EXPORT Value require(const char *filename);
+inline PHPCPP_EXPORT Value require(const std::string &filename) { return require(filename.c_str()); }
+extern PHPCPP_EXPORT Value require_once(const char *filename);
+inline PHPCPP_EXPORT Value require_once(const std::string &filename) { return require_once(filename.c_str()); }
+extern PHPCPP_EXPORT const char *sapi_name();
/**
* Call a function in PHP
@@ -60,51 +60,51 @@ Value call(const char *name, Params&&... params)
// the name can be turned into a Php::Value object, which implements
// the operator () method to call it
Value function(name);
-
+
// invoke the operator ()
return function(std::forward<Params>(params)...);
}
/**
* Long list of simply-forwarded function calls
- *
+ *
* Most functions in this list are forwarded to the call() method described
- * above, which of course is slower than necessary, because they will have to
+ * above, which of course is slower than necessary, because they will have to
* pass the entire zend engine to look up the actual implementation, while a
- * direct call the C implementation was possible too. The reason for this is
+ * direct call the C implementation was possible too. The reason for this is
* that we are lazy - if you feel like looking up the actual implementation for
* each function in the PHP source, your support is more than welcome.
- *
+ *
* But since it is a stupid idea to call a PHP function from your extension
* anyway (that's what people write extension for: to get away from PHP and
* make the code run on the highway), it is not expected that these functions
* are going to be used very often anyway.
*/
-inline Value array_key_exists(const Value &key, const Value &array) { return array.contains(key); }
-inline Value array_key_exists(int key, const Value &array) { return array.contains(key); }
-inline Value array_key_exists(const char *key, const Value &array) { return array.contains(key); }
-inline Value array_key_exists(const std::string &key, const Value &array) { return array.contains(key); }
-inline Value array_keys(const Value &value) { return call("array_keys", value); }
-inline Value array_push(const Value &array, const Value &value) { return call("array_push", array, value); }
-inline Value array_values(const Value &value) { return call("array_values", value); }
-inline Value count(const Value &value) { return call("count", value); }
-inline Value echo(const char *input) { out << input; return nullptr; }
-inline Value echo(const std::string &input) { out << input; return nullptr; }
-inline Value empty(const Value &value) { return value.isNull() || !value.boolValue(); }
-inline Value empty(const HashMember<std::string> &member) { return !member.exists() || empty(member.value()); }
-inline Value empty(const HashMember<int> &member) { return !member.exists() || empty(member.value()); }
-inline Value is_array(const Value &value) { return value.isArray(); }
-inline Value strlen(const Value &value) { return call("strlen", value); }
-inline void unset(const HashMember<std::string> &member) { member.unset(); }
-inline void unset(const HashMember<int> &member) { member.unset(); }
-inline void unset(const HashMember<Value> &member) { member.unset(); }
+inline PHPCPP_EXPORT Value array_key_exists(const Value &key, const Value &array) { return array.contains(key); }
+inline PHPCPP_EXPORT Value array_key_exists(int key, const Value &array) { return array.contains(key); }
+inline PHPCPP_EXPORT Value array_key_exists(const char *key, const Value &array) { return array.contains(key); }
+inline PHPCPP_EXPORT Value array_key_exists(const std::string &key, const Value &array) { return array.contains(key); }
+inline PHPCPP_EXPORT Value array_keys(const Value &value) { return call("array_keys", value); }
+inline PHPCPP_EXPORT Value array_push(const Value &array, const Value &value) { return call("array_push", array, value); }
+inline PHPCPP_EXPORT Value array_values(const Value &value) { return call("array_values", value); }
+inline PHPCPP_EXPORT Value count(const Value &value) { return call("count", value); }
+inline PHPCPP_EXPORT Value echo(const char *input) { out << input; return nullptr; }
+inline PHPCPP_EXPORT Value echo(const std::string &input) { out << input; return nullptr; }
+inline PHPCPP_EXPORT Value empty(const Value &value) { return value.isNull() || !value.boolValue(); }
+inline PHPCPP_EXPORT Value empty(const HashMember<std::string> &member) { return !member.exists() || empty(member.value()); }
+inline PHPCPP_EXPORT Value empty(const HashMember<int> &member) { return !member.exists() || empty(member.value()); }
+inline PHPCPP_EXPORT Value is_array(const Value &value) { return value.isArray(); }
+inline PHPCPP_EXPORT Value strlen(const Value &value) { return call("strlen", value); }
+inline PHPCPP_EXPORT void unset(const HashMember<std::string> &member) { member.unset(); }
+inline PHPCPP_EXPORT void unset(const HashMember<int> &member) { member.unset(); }
+inline PHPCPP_EXPORT void unset(const HashMember<Value> &member) { member.unset(); }
/**
* The 'ini_get' function returns an IniValue, so that it can also be used
* before the PHP engine is started.
*/
-inline IniValue ini_get(const char* name) { return IniValue(name, false); }
-inline IniValue ini_get_orig(const char* name) { return IniValue(name, true); }
+inline PHPCPP_EXPORT IniValue ini_get(const char* name) { return IniValue(name, false); }
+inline PHPCPP_EXPORT IniValue ini_get_orig(const char* name) { return IniValue(name, true); }
/**
@@ -116,10 +116,10 @@ inline IniValue ini_get_orig(const char* name) { return IniValue(name, true); }
/**
* Define the isset function
*/
-inline Value isset(const Value &value) { return call("isset", value); }
-inline Value isset(const HashMember<std::string> &member) { return member.exists() && isset(member.value()); }
-inline Value isset(const HashMember<int> &member) { return member.exists() && isset(member.value()); }
-inline Value isset(const HashMember<Value> &member) { return member.exists() && isset(member.value()); }
+inline PHPCPP_EXPORT Value isset(const Value &value) { return call("isset", value); }
+inline PHPCPP_EXPORT Value isset(const HashMember<std::string> &member) { return member.exists() && isset(member.value()); }
+inline PHPCPP_EXPORT Value isset(const HashMember<int> &member) { return member.exists() && isset(member.value()); }
+inline PHPCPP_EXPORT Value isset(const HashMember<Value> &member) { return member.exists() && isset(member.value()); }
/**
* Re-install the ISSET macro
diff --git a/include/class.h b/include/class.h
index c7ae32a..e92dfc3 100644
--- a/include/class.h
+++ b/include/class.h
@@ -24,26 +24,26 @@ namespace Php {
* Class definition of the class
*/
template <typename T>
-class Class : private ClassBase
+class PHPCPP_EXPORT Class : private ClassBase
{
public:
/**
* Constructor
- *
+ *
* The flags can be a combination of Php::Final and Php::Abstract.
* If no flags are set, a regular public class will be formed.
- *
+ *
* @param name Name of the class
* @param flags Accessibility flags
*/
Class(const char *name, int flags = 0) : ClassBase(name, flags) {}
-
+
/**
* Copy constructor
* @param that
*/
Class(const Class<T> &that) : ClassBase(that) {}
-
+
/**
* Move constructor
* @param that
@@ -54,17 +54,17 @@ public:
* Destructor
*/
virtual ~Class() {}
-
+
/**
* Add a regular method to the class
- *
+ *
* The method will be accessible as one of the class methods in your PHP
* code. When the method is called, it will automatically be forwarded
* to the C++ implementation. The flags can be Php::Public, Php::Protected
* or Php::Private (using private methods can be useful if you for example
* want to make the __construct() function private). The access-modified
* flag can be bitwise combined with the flag Php::Final or Php::Abstract).
- *
+ *
* @param name Name of the method
* @param method The actual method
* @param flags Optional flags
@@ -90,18 +90,18 @@ public:
/**
* Add a static method to a class
- *
- * In C++ a static method is in reality just a plain function, that at
- * compile time has access to private properties of the class that it is a
- * static member of.
- *
- * Because a C++ static method is not a real method with a 'this' pointer,
+ *
+ * In C++ a static method is in reality just a plain function, that at
+ * compile time has access to private properties of the class that it is a
+ * static member of.
+ *
+ * Because a C++ static method is not a real method with a 'this' pointer,
* it has the same signature as a normal C++ (non-method) function. Therefore,
* you can register real static member functions (&MyClass::myMethod) as well
* as normal functions (myFunction) as class methods.
- *
+ *
* In PHP scripts, such functions will be callable as static class methods
- *
+ *
* @param name Name of the method
* @param method The actual method
* @param flags Optional flags
@@ -119,11 +119,11 @@ public:
/**
* Add an abstract method to the class
- *
- * This is only meaningful for classes that can be extended. Because the
+ *
+ * This is only meaningful for classes that can be extended. Because the
* method is abstract, you will not have to pass an implementation. You
* can pass in flags to mark the method as protected
- *
+ *
* @param name Name of the method
* @param flags Optional flags
* @param args Argument descriptions
@@ -134,13 +134,13 @@ public:
/**
* Add a property to the class
- *
+ *
* Every instance of this class will have this property. The property
* can be Php::Public, Php::Protected or Php::Private (altough setting
* private properties is odd as the implementation of the class is in CPP,
* so why use private properties while the whole implementation is already
* hidden)
- *
+ *
* @param name Name of the property
* @param value Actual default property value
* @param flags Optional flags
@@ -158,13 +158,13 @@ public:
/**
* Create a class constant
- *
+ *
* The class constant can be used in a php script as "ClassName::CONSTANT_NAME".
* It is a good programming practive to only use uppercase characters for
* constants.
- *
+ *
* This is an alias for adding a class property with the "Php::Const" flag.
- *
+ *
* @param name Name of the constant
* @param value Constant value
* @return Class Same object to allow chaining
@@ -174,7 +174,7 @@ public:
/**
* Add a Php::Constant to a class to use it as a class constant
- *
+ *
* @param constant The constant to add
* @return Class Same object to allow chaining
*/
@@ -183,13 +183,13 @@ public:
/**
* Properties as methods
- *
+ *
* This is a smarter way for adding properties to a class. You can define
* a property and a method that gets called every time the property is
* set or unset.
- *
+ *
* If you do not set a setter method, your property will be read-only.
- *
+ *
* @param name Name of the property
* @param getter The getter method
* @param setter The setter method
@@ -203,32 +203,32 @@ public:
/**
* Add a PHP interface to the class
- *
+ *
* Note that the interface that you supply must already exist! Therefore
* you can only supply interfaces that you created in your own extension.
- *
+ *
* @param interface Interface object
* @return Class Same object to allow chaining
*/
Class<T> &implements(const Interface &interface) { ClassBase::implements(interface); return *this; }
-
+
/**
* Add a base class
- *
+ *
* Because PHP does not allow multiple inheritance, you can only add one
* base class. If you call this method more than once, the earlier base
* class is overridden.
- *
+ *
* The base class that you supply must already be registered. And because
* your extension is most likely registered before any user space PHP scripts
* run, you can only specify classes that you created in your own extension.
- *
+ *
* @param base Php::Class object
* @return Class Same object to allow chaining
*/
template<typename CLASS>
Class<T> &extends(const Class<CLASS> &base) { ClassBase::extends(base); return *this; }
-
+
private:
/**
* Method to create the object if it is default constructable
@@ -265,7 +265,7 @@ private:
// construct an instance
return maybeConstruct<T>();
}
-
+
/**
* Method to clone the object if it is copy constructable
* @param orig
@@ -296,11 +296,11 @@ private:
* Is this a clonable class?
* @return bool
*/
- virtual bool clonable() const
+ virtual bool clonable() const
{
return std::is_copy_constructible<T>::value;
}
-
+
/**
* Construct a clone
* @param orig
@@ -311,7 +311,7 @@ private:
// maybe clone it (if the class has a copy constructor)
return maybeClone<T>((T*)orig);
}
-
+
/**
* Is this class traversable?
* @return bool
@@ -336,11 +336,11 @@ private:
* Call the __clone method
* @param base
*/
- virtual void callClone(Base *base) const
+ virtual void callClone(Base *base) const
{
// cast to the user object
T *object = (T *)base;
-
+
// call the method on the base object
return object->__clone();
}
@@ -353,7 +353,7 @@ private:
{
// cast to the user object
T *object = (T *)base;
-
+
// call the method on the base object
return object->__destruct();
}
@@ -369,16 +369,16 @@ private:
{
// cast to the user object
T *object = (T *)base;
-
+
// call the method on the base object
return object->__call(name, params);
}
/**
* SFINAE test to check if the __callStatic method is defined
- *
+ *
* This type trait checks if the __callStatic method is defined in class T
- *
+ *
* @see http://stackoverflow.com/questions/257288/is-it-possible-to-write-a-c-template-to-check-for-a-functions-existence
*/
template <typename X>
@@ -420,7 +420,7 @@ private:
{
// this is not implemented
notImplemented();
-
+
// unreachable
return nullptr;
}
@@ -446,7 +446,7 @@ private:
{
// cast to actual object
T *obj = (T *)object;
-
+
// pass on
return obj->__invoke(params);
}
@@ -460,11 +460,11 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return Value(obj->__toString()).setType(Type::String);
}
-
+
/**
* Cast to integer function
* @param base
@@ -474,21 +474,21 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return Value(obj->__toInteger()).setType(Type::Numeric);
}
-
+
/**
* Cast to float function
* @param base
* @return Value
*/
- virtual Value callToFloat(Base *base) const override
+ virtual Value callToFloat(Base *base) const override
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return Value(obj->__toFloat()).setType(Type::Float);
}
@@ -502,7 +502,7 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return Value(obj->__toBool()).setType(Type::Bool);
}
@@ -518,11 +518,11 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return obj->__get(name);
}
-
+
/**
* Function to set/overwrite a property
* @param base
@@ -533,11 +533,11 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
obj->__set(name, value);
}
-
+
/**
* Function to remove a property
* @param base
@@ -547,7 +547,7 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
obj->__unset(name);
}
@@ -562,7 +562,7 @@ private:
{
// cast to actual object
T *obj = (T *)base;
-
+
// pass on
return obj->__isset(name);
}
@@ -578,29 +578,28 @@ private:
// cast to the actual implementation type
T *t1 = (T *)object1;
T *t2 = (T *)object2;
-
+
// compare the two objects
return t1->__compare(*t2);
}
/**
- * Namespaces and the function have access to the private base class,
+ * Namespaces and the function have access to the private base class,
* so that the classes can be registered, and the Functor object needs
* this to register the PhpCpp::Functor class.
*/
friend class Namespace;
friend class Functor;
-
+
/**
* All Php::Class<AnyThing> also need access to the base class to
* register this class as base class.
*/
template<typename ANYTHING> friend class Class;
-
+
};
/**
* End of namespace
*/
}
-
diff --git a/include/classbase.h b/include/classbase.h
index 9e53a62..0db0c35 100644
--- a/include/classbase.h
+++ b/include/classbase.h
@@ -6,7 +6,7 @@
* you can not create any instances if this class yourself (and you are not
* supposed to do that either).
*
- * Further more, because this base class is a 'private' base of Class, all
+ * Further more, because this base class is a 'private' base of Class, all
* features of it are normally also inaccessible.
*
* In other words: it is not meant to be directly used by extension writers.
@@ -22,7 +22,7 @@ namespace Php {
/**
* A couple of predefined native callback functions that can be registered.
* These are functions that optional accept a Request and/or Parameters object,
- * and that either return void or a Value object.
+ * and that either return void or a Value object.
*/
typedef void (*native_callback_0)();
typedef void (*native_callback_1)(Parameters &);
@@ -57,7 +57,7 @@ class ClassImpl;
/**
* Class definition
*/
-class ClassBase
+class PHPCPP_EXPORT ClassBase
{
protected:
/**
@@ -66,14 +66,14 @@ protected:
* @param flags Class flags
*/
ClassBase(const char *classname, int flags);
-
+
/**
* Protected constructor
* @param classname Class name
* @param type Class type
*/
ClassBase(const char *classname, ClassType type);
-
+
public:
/**
* Copy constructor
@@ -115,14 +115,14 @@ public:
* @return int
*/
virtual int callCompare(Base *object1, Base *object2) const { return 1; }
-
+
/**
* Call the __clone and __destruct magic methods
* @param base
*/
virtual void callClone(Base *base) const {}
virtual void callDestruct(Base *base) const {}
-
+
/**
* Call the __call(), __invoke() or __callStatic() method
* @param base Object to call on
@@ -133,7 +133,7 @@ public:
virtual Value callCall(Base *base, const char *name, Parameters &params) const { return nullptr; }
virtual Value callInvoke(Base *base, Parameters &params) const { return nullptr; }
virtual Value callCallStatic(const char *name, Parameters &params) const { return nullptr; }
-
+
/**
* Casting functions
* @param base
@@ -143,7 +143,7 @@ public:
virtual Value callToInteger(Base *base) const { return Value(Type::Numeric); }
virtual Value callToFloat(Base *base) const { return Value(Type::Float); }
virtual Value callToBool(Base *base) const { return Value(Type::Bool); }
-
+
/**
* Function to get and set properties
* @param base
@@ -155,7 +155,7 @@ public:
virtual void callSet(Base *base, const Value &name, const Value &value) const {}
virtual void callUnset(Base *base, const Value &name) const {}
virtual bool callIsset(Base *base, const Value &name) const { return false; }
-
+
/**
* Get access to the implementation object
* @return std::shared_ptr
@@ -171,14 +171,14 @@ protected:
/**
* Add a method to the class
- *
+ *
* The method will be accessible as one of the class methods in your PHP
* code. When the method is called, it will automatically be forwarded
* to the C++ implementation. The flags can be Php::Public, Php::Protected
* or Php::Private (using private methods can be useful if you for example
* want to make the __construct() function private). The access-modified
* flag can be bitwise combined with the flag Php::Final or Php::Abstract).
- *
+ *
* @param name Name of the method
* @param method The actual method
* @param flags Optional flags
@@ -195,11 +195,11 @@ protected:
/**
* Add a static method to the class
- *
+ *
* Because a C++ static method is just a regular function, that happens to
* have access to the private variables of the class at compile time, you
* can register any function that matches one of the function signatures
- *
+ *
* @param name Name of the method
* @param method The actual method
* @param flags Optional flags
@@ -212,7 +212,7 @@ protected:
/**
* Add an abstract method to the class
- *
+ *
* @param name Name of the method
* @param flags Optional flags (like public or protected)
* @param args Description of the supported arguments
@@ -221,13 +221,13 @@ protected:
/**
* Add a property to the class
- *
+ *
* Every instance of this class will have this property. The property
* can be Php::Public, Php::Protected or Php::Private (altough setting
* private properties is odd as the implementation of the class is in CPP,
* so why use private properties while the whole implementation is already
* hidden)
- *
+ *
* @param name Name of the property
* @param value Actual property value
* @param flags Optional flags
@@ -273,16 +273,15 @@ private:
* @var std::shared_ptr<ClassImpl>
*/
std::shared_ptr<ClassImpl> _impl;
-
+
/**
* Constants can be used as class properties, and need access to private
* and protected methods
*/
friend class ConstantImpl;
};
-
+
/**
* End namespace
*/
}
-
diff --git a/include/classtype.h b/include/classtype.h
index 382a8db..9b6cc9e 100644
--- a/include/classtype.h
+++ b/include/classtype.h
@@ -14,16 +14,16 @@ namespace Php {
/**
* Enumeration definition.
- *
+ *
* The PHP-CPP library tries to hide the Zend engine internals completely from
* the user. Therefore, it does not include any of the Zend header files, nor
- * can it refer to the constants defined in the Zend header files. The
+ * can it refer to the constants defined in the Zend header files. The
* following constants have been copied from Zend. If the Zend engine ever
* changes (which we do not expect) we should also copy the constant values
* used here.
- *
+ *
*/
-enum class ClassType {
+enum class PHPCPP_EXPORT ClassType {
Regular = 0x00,
Abstract = 0x20,
Final = 0x40,
diff --git a/include/constant.h b/include/constant.h
index 5e18792..0f2b354 100644
--- a/include/constant.h
+++ b/include/constant.h
@@ -1,13 +1,13 @@
/**
* Constant.h
- *
+ *
* If you want to define global PHP constants, or class constants you can
* use this constant class for it. Wrap the constant you'd like to create
* in a Php::Constant object and add it to the extension or the class:
- *
+ *
* extension.add(Php::Constant("CONSTANT_NAME", "value"));
* myclass.add(Php::Constant("CLASS_CONSTANT", "value"));
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2015 Copernica BV
*/
@@ -25,7 +25,7 @@ class ConstantImpl;
/**
* Class definition
*/
-class Constant
+class PHPCPP_EXPORT Constant
{
public:
/**
@@ -42,27 +42,27 @@ public:
Constant(const char *name, const char *value);
Constant(const char *name, const char *value, size_t size);
Constant(const char *name, const std::string &value);
-
+
/**
* Destructor
*/
virtual ~Constant() {}
-
+
/**
* Add the constant to a class
- *
+ *
* You normally do not have to call this method yourself. You can simply
* do one of the following method calls to create class constants:
- *
+ *
* myclass.property("MY_CONSTANT", "value", Php::Const);
* myclass.constant("MY_CONSTANT", "value");
* myclass.add(Php::Constant("MY_CONSTANT", "value"));
- *
+ *
* All of the calls have the same result, it is up to you to decide which
* one suits you most. If you use the last one - using a Php::Constant
* class - the PHP-CPP library will call this "addTo()" method internally
* to forward the call to one of the other methods.
- *
+ *
* @param clss Class to which the constant is added
* @internal
*/
@@ -80,16 +80,15 @@ private:
* @return std::shared_ptr
*/
const std::shared_ptr<ConstantImpl> &implementation() const { return _impl; }
-
+
/**
* The extension object has access to privates
*/
friend class ExtensionImpl;
-};
-
+};
+
/**
* End of namespace
*/
}
-
diff --git a/include/countable.h b/include/countable.h
index d4c1823..8ff0c61 100644
--- a/include/countable.h
+++ b/include/countable.h
@@ -1,11 +1,11 @@
/**
* Countable.h
- *
+ *
* "Interface" that can be "implemented" by your class. If you do, you
* create your class like this:
- *
+ *
* class MyClass : public Php::Base, public Php::Countable { ... }
- *
+ *
* You will have to implement the count() method, which should return the
* number of elements in the object
*
@@ -17,11 +17,11 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Class definition
*/
-class Countable
+class PHPCPP_EXPORT Countable
{
public:
/**
@@ -31,9 +31,8 @@ public:
virtual long count() = 0;
};
-
+
/**
* End namespace
*/
}
-
diff --git a/include/exception.h b/include/exception.h
index 15e92bc..55601c2 100644
--- a/include/exception.h
+++ b/include/exception.h
@@ -1,7 +1,7 @@
/**
* Exception.h
* Implementation of Php Exceptions.
- *
+ *
* @author Jasper van Eck <jasper.vaneck@copernica.com>
* @copyright 2013, 2014 Copernica BV
*/
@@ -12,10 +12,10 @@
*/
namespace Php {
-/**
+/**
* Class definition
*/
-class Exception : public std::exception
+class PHPCPP_EXPORT Exception : public std::exception
{
private:
/**
@@ -23,31 +23,31 @@ private:
* @var char*
*/
std::string _message;
-
+
/**
* The PHP exception code
* @var int
*/
int _code;
-
+
/**
* Has this exception been processed by native C++ code?
* @var bool
*/
bool _processed = false;
-
+
public:
/**
* Constructor
* @param &string
*/
Exception(const std::string &message, int code = 0) : std::exception(), _message(message), _code(code) {}
-
+
/**
* Destructor
*/
virtual ~Exception() throw() {}
-
+
/**
* Overridden what method
* @return const char *
@@ -56,7 +56,7 @@ public:
{
return _message.c_str();
}
-
+
/**
* Returns the message of the exception.
* @return &string
@@ -75,7 +75,7 @@ public:
// yes, it is native
return true;
}
-
+
/**
* Report this error as a fatal error
* @return bool
@@ -91,5 +91,3 @@ public:
* End of namespace
*/
}
-
-
diff --git a/include/extension.h b/include/extension.h
index 15ad5e1..caa3d33 100644
--- a/include/extension.h
+++ b/include/extension.h
@@ -6,11 +6,11 @@
* apache process starts - and will be used for all subsequent requests that
* are handled by Apache.
*
- * For some environments (for example CLI scripts and CGI calls) only one
+ * For some environments (for example CLI scripts and CGI calls) only one
* request is handled by an extension instance, but for others (when PHP runs
* as module in a webserver) many requests are handled by the same extension
* instance.
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2013, 2014 Copernica BV
*/
@@ -33,7 +33,7 @@ using Callback = std::function<void()>;
/**
* Class definition
*/
-class Extension : public Namespace
+class PHPCPP_EXPORT Extension : public Namespace
{
public:
/**
@@ -51,68 +51,68 @@ public:
* @param apiversion PHP API version (this should always be PHPCPP_API_VERSION, so you better not supply it)
*/
Extension(const char *name, const char *version = "1.0", int apiversion = PHPCPP_API_VERSION);
-
+
/**
* No copy'ing and no moving
*/
Extension(const Extension &extension) = delete;
Extension(Extension &&extension) = delete;
-
+
/**
* Destructor
*/
virtual ~Extension();
-
+
/**
* Register a function to be called when the PHP engine is ready
- *
- * The callback will be called after all extensions are loaded, and all
+ *
+ * The callback will be called after all extensions are loaded, and all
* functions and classes are available, but before the first pageview/request
* is handled. You can register this callback if you want to be notified
* when the engine is ready, for example to initialize certain things.
- *
+ *
* @param callback Function to be called
* @return Extension Same object to allow chaining
*/
Extension &onStartup(const Callback &callback);
-
+
/**
* Register a function to be called when the PHP engine is going to stop
- *
+ *
* The callback will be called right before the process is going to stop.
* You can register a function if you want to clean up certain things.
- *
+ *
* @param callback Function to be called
* @return Extension Same object to allow chaining
*/
Extension &onShutdown(const Callback &callback);
-
+
/**
* Register a callback that is called at the beginning of each pageview/request
- *
+ *
* You can register a callback if you want to initialize certain things
* at the beginning of each request. Remember that the extension can handle
* multiple requests after each other, and you may want to set back certain
* global variables to their initial variables in front of each request
- *
+ *
* @param callback Function to be called
* @return Extension Same object to allow chaining
*/
Extension &onRequest(const Callback &callback);
-
+
/**
* Register a callback that is called to cleanup things after a pageview/request
- *
+ *
* The callback will be called after _each_ request, so that you can clean up
* certain things and make your extension ready to handle the next request.
* This method is called onIdle because the extension is idle in between
* requests.
- *
+ *
* @param callback Function to be called
* @return Extension Same object to allow chaining
*/
Extension &onIdle(const Callback &callback);
-
+
/**
* Add a ini entry to the extension by moving it
* @param ini The php.ini setting
@@ -122,10 +122,10 @@ public:
{
// skip when locked
if (locked()) return *this;
-
+
// and add it to the list of classes
_ini_entries.emplace_back(new Ini(std::move(ini)));
-
+
// allow chaining
return *this;
}
@@ -142,11 +142,11 @@ public:
// and add it to the list of classes
_ini_entries.emplace_back(new Ini(ini));
-
+
// allow chaining
return *this;
}
-
+
/**
* Because the add function exists in both the Namespace base class
* as well as this extended Extension class, we have to tell the compiler
@@ -165,9 +165,9 @@ public:
/**
* Apply a callback to each php.ini variable
- *
+ *
* The callback will be called with a reference to the ini variable.
- *
+ *
* @param callback
*/
void iniVariables(const std::function<void(Ini &ini)> &callback)
@@ -178,30 +178,30 @@ public:
/**
* Retrieve the module pointer
- *
+ *
* This is the memory address that should be exported by the get_module()
* function.
*
* @return void*
*/
void *module();
-
+
/**
* Cast to a module entry
- *
+ *
* @return void*
*/
operator void * ()
{
return module();
}
-
+
protected:
/**
* Is the extension object in a locked state? This happens after the
* get_module() function was called for the first time ("apache reload"
* forces a new call to get_module())
- *
+ *
* @return bool
*/
virtual bool locked() const override;
@@ -209,7 +209,7 @@ protected:
private:
/**
* The implementation object
- *
+ *
* @var ExtensionImpl
*/
ExtensionImpl *_impl;
@@ -226,5 +226,3 @@ private:
* End of namespace
*/
}
-
-
diff --git a/include/fatalerror.h b/include/fatalerror.h
index b178f25..bda717a 100644
--- a/include/fatalerror.h
+++ b/include/fatalerror.h
@@ -1,18 +1,18 @@
/**
* FatalError.h
- *
- *
+ *
+ *
* Normally, fatal errors are reported with a call to zend_error().
- *
+ *
* However, this will trigger a longjmp(), which will cause objects
* constructed in the extension not to be destructed. We use therefore
* this FatalError class, which is a normally exception that _does_
* cause objects to be destructed.
- *
+ *
* When it is caught, right before control is handed back to the Zend
* engine, it will turn the exception into a zend_error() call and
* thus a longjmp.
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2014 Copernica BV
*/
@@ -25,7 +25,7 @@ namespace Php {
/**
* Class definition
*/
-class FatalError : public Exception
+class PHPCPP_EXPORT FatalError : public Exception
{
public:
/**
@@ -33,11 +33,11 @@ public:
* @param message
*/
FatalError(const std::string &message) : Exception(message) {}
-
+
/**
* Destructor
*/
- virtual ~FatalError() throw()
+ virtual ~FatalError() throw()
{
}
@@ -51,16 +51,15 @@ public:
// as exception, but it should live on as zend_error() in stead
return false;
}
-
+
/**
* Report this error as a fatal error
* @return bool
*/
virtual bool report() const override;
};
-
+
/**
* End of namespace
*/
}
-
diff --git a/include/file.h b/include/file.h
index 7029bb6..fff3cd0 100644
--- a/include/file.h
+++ b/include/file.h
@@ -7,7 +7,7 @@
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2014 Copernica BV
*/
-
+
/**
* Set up namespace
*/
@@ -16,23 +16,23 @@ namespace Php {
/**
* Class definition
*/
-class File
+class PHPCPP_EXPORT File
{
public:
/**
* Constructor
- *
+ *
* The constructor receives a filename as parameter. It uses the normal
- * PHP include path resolve algorithms to find the location of the file.
- *
+ * PHP include path resolve algorithms to find the location of the file.
+ *
* @param name the filename
* @param size size of the filename
*/
File(const char *name, size_t size);
-
+
/**
* Alternative constructor with just a filename
- *
+ *
* @param name the filename
*/
File(const char *name) : File(name, ::strlen(name)) {}
@@ -42,7 +42,7 @@ public:
* @param name the filename
*/
File(const std::string &name) : File(name.c_str(), name.size()) {}
-
+
/**
* Alternative constructor with a Value object
* @param name the filename
@@ -53,13 +53,13 @@ public:
* Destructor
*/
virtual ~File();
-
+
/**
* Does the file exist?
* @return boolean
*/
bool exists();
-
+
/**
* Is this a valid file?
* @return boolean
@@ -71,20 +71,20 @@ public:
* @return Php::Value
*/
Value once();
-
+
/**
* Execute the file
* @return Php::Value
*/
Value execute();
-
+
private:
/**
* The full resolved path name
* @var const char *
*/
char *_path = nullptr;
-
+
/**
* The opcodes of this file
* @var Opcodes
@@ -96,11 +96,10 @@ private:
* @return bool
*/
bool compile();
-
+
};
-
+
/**
* End of namespace
*/
}
-
diff --git a/include/function.h b/include/function.h
index e6693d7..cc8ad02 100644
--- a/include/function.h
+++ b/include/function.h
@@ -1,24 +1,24 @@
/**
* Function.h
- *
- * Small extension to the Value class that allows a value to be
- * constructed with a std::function.
- *
+ *
+ * Small extension to the Value class that allows a value to be
+ * constructed with a std::function.
+ *
* If you want to assign a std::function to a value, the following
* piece of code won't work:
- *
+ *
* Php::Value value([]() { .... });
- *
+ *
* Because the passed in function would match with many of the possible
- * Value constructors. For that reason we have created a small and
+ * Value constructors. For that reason we have created a small and
* simple Function class that can be used instead:
- *
+ *
* Php::Function valu([]() { .... });
- *
+ *
* A Php::Function is an extended Php::Value object, so can be used
* in place of Php::Values all the time. The only difference is that
* it has a different constructor
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2015 Copernica BV
*/
@@ -27,11 +27,11 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Class definition
*/
-class Function : public Value
+class PHPCPP_EXPORT Function : public Value
{
public:
/**
@@ -42,22 +42,22 @@ public:
/**
* Constructor to wrap a function that does not accept parameters
- *
+ *
* Old C++ compilers do not see a difference between std::function
* objects based on the function signature, so these old compilers
* do not see this method.
- *
+ *
* @param function The C++ function to be wrapped
*/
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7) || __clang__
Function(const std::function<Value()> &function) : Function([function](Parameters &params) -> Value {
-
+
// call original function, forget about the parameters
return function();
-
+
}) {}
#endif
-
+
/**
* Destructor
*/
@@ -77,4 +77,3 @@ private:
* End namespace
*/
}
-
diff --git a/include/global.h b/include/global.h
index 2757979..7a66997 100644
--- a/include/global.h
+++ b/include/global.h
@@ -21,7 +21,7 @@ namespace Php {
/**
* Class definition
*/
-class Global : public Value
+class PHPCPP_EXPORT Global : public Value
{
public:
/**
@@ -40,7 +40,7 @@ public:
* Destructor
*/
virtual ~Global() {}
-
+
/**
* Assignment operator
* @param global
@@ -51,14 +51,14 @@ public:
{
// skip self assignment
if (&global == this) return *this;
-
+
// call base
Value::operator=(global);
-
+
// copy name and exists setting
_name = global._name;
_exists = global._exists;
-
+
// done
return *this;
}
@@ -74,19 +74,19 @@ public:
{
// skip self assignment
if (&global == this) return *this;
-
+
// call base
Value::operator=(std::move(global));
-
+
// copy name and exists setting
_name = std::move(global._name);
_exists = global._exists;
-
+
// done
return *this;
}
*/
-
+
/**
* Assignment operator
* @param value
@@ -110,11 +110,11 @@ public:
{
// update current object
update();
-
+
// call base
Value::set(index, value);
}
-
+
/**
* Set a certain property
* Calling this method will turn the value into an array
@@ -127,7 +127,7 @@ public:
{
// update current object
update();
-
+
// call base
Value::set(key, size, value);
}
@@ -139,14 +139,14 @@ protected:
* @return Value
*/
Global &update();
-
+
private:
/**
* Constructor for non-existing var
* @param name
*/
Global(const char *name) : Value(), _name(name), _exists(false) {}
-
+
/**
* Alternative constructor for non-existing var
* @param name
@@ -159,7 +159,7 @@ private:
* @param val
*/
Global(const char *name, struct _zval_struct *val) : Value(val, true), _name(name), _exists(true) {}
-
+
/**
* Alternative constructor to wrap zval
* @param name
@@ -172,13 +172,13 @@ private:
* @var string
*/
std::string _name;
-
+
/**
* Does it already exist?
* @var bool
*/
bool _exists;
-
+
/**
* The globals can access the private method from this class
*/
@@ -189,5 +189,3 @@ private:
* End of namespace
*/
}
-
-
diff --git a/include/globals.h b/include/globals.h
index b996131..231b8bd 100644
--- a/include/globals.h
+++ b/include/globals.h
@@ -4,14 +4,14 @@
* Wrapper object that gives access to all global variables. You
* can use it more or less the same as the $_GLOBALS object in
* PHP.
- *
+ *
* The global PHP variables are acessible via the Php::globals["varname"]
* variables.
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2013 Copernica BV
*/
-
+
/**
* Set up namespace
*/
@@ -25,7 +25,7 @@ class Global;
/**
* Class definition
*/
-class Globals
+class PHPCPP_EXPORT Globals
{
public:
/**
@@ -33,32 +33,32 @@ public:
*/
Globals(const Globals &globals) = delete;
Globals(Globals &&globals) = delete;
-
+
/**
* Destructor
*/
virtual ~Globals() {}
-
+
/**
* Get access to a global variable
* @param name
* @return Global
*/
Global operator[](const char *name);
-
+
/**
* Get access to a global variable
* @param name
* @return Global
*/
Global operator[](const std::string &name);
-
+
private:
/**
* Constructor
*/
Globals() {}
-
+
public:
/**
* Get the one and only instance
@@ -77,4 +77,3 @@ extern Globals &GLOBALS;
* End of namespace
*/
}
-
diff --git a/include/hashmember.h b/include/hashmember.h
index ce27192..12ee385 100644
--- a/include/hashmember.h
+++ b/include/hashmember.h
@@ -6,7 +6,7 @@
* keeps track of the array to which it belongs, and that will update
* the array when the member is modified
*
- * You are not supposed to instantiate this class. An instance of it is
+ * You are not supposed to instantiate this class. An instance of it is
* created when you call Value::operator[]
*
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
@@ -17,7 +17,7 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Forward definitions
*/
@@ -27,7 +27,7 @@ class Value;
* Member class
*/
template <typename Type>
-class HashMember : private HashParent
+class PHPCPP_EXPORT HashMember : private HashParent
{
public:
/**
@@ -36,7 +36,7 @@ public:
* @param index
*/
HashMember(HashParent *parent, Type index) : _parent(parent), _index(index) {}
-
+
/**
* Destructor
*/
@@ -111,7 +111,7 @@ public:
{
return value().numericValue();
}
-
+
/**
* Cast to a boolean
* @return boolean
@@ -120,7 +120,7 @@ public:
{
return value().boolValue();
}
-
+
/**
* Cast to a string
* @return string
@@ -129,7 +129,7 @@ public:
{
return value().stringValue();
}
-
+
/**
* Cast to byte array
* @return const char *
@@ -138,7 +138,7 @@ public:
{
return value().rawValue();
}
-
+
/**
* Cast to a floating point
* @return double
@@ -147,7 +147,7 @@ public:
{
return value().floatValue();
}
-
+
/**
* Array access operator
* This can be used for accessing arrays
@@ -210,7 +210,7 @@ public:
HashMember &operator-=(const std::string &value) { return operator=(this->value() - value); }
HashMember &operator-=(const char *value) { return operator=(this->value() - value); }
HashMember &operator-=(double value) { return operator=(this->value() - value); }
-
+
/**
* Multiply the object with a certain value
* @param value
@@ -255,7 +255,7 @@ public:
HashMember &operator%=(const std::string &value) { return operator=(this->value() % value); }
HashMember &operator%=(const char *value) { return operator=(this->value() % value); }
HashMember &operator%=(double value) { return operator=(this->value() % value); }
-
+
/**
* Assignment operator
* @param value
@@ -330,7 +330,7 @@ public:
Value operator%(const std::string &value) { return this->value() % value; }
Value operator%(const char *value) { return this->value() % value; }
Value operator%(double value) { return this->value() % value; }
-
+
/**
* Comparison operators
* @param value
@@ -378,7 +378,7 @@ public:
// object must exist, and the value must contain the key
return exists() && value().contains(key);
}
-
+
/**
* Check if a certain index exists in the array/object
* @param index
@@ -400,7 +400,7 @@ public:
// object must exist, and the value must contain the key
return exists() && value().contains(key);
}
-
+
/**
* Retrieve the value at a string index
* @param key
@@ -410,11 +410,11 @@ public:
{
// return null if it does not exist
if (!exists()) return nullptr;
-
+
// ask the value
return value().get(key);
}
-
+
/**
* Retrieve the value at a numeric index
* @param index
@@ -424,7 +424,7 @@ public:
{
// return null if it does not exist
if (!exists()) return nullptr;
-
+
// ask the value
return value().get(index);
}
@@ -438,11 +438,11 @@ public:
{
// return null if it does not exist
if (!exists()) return nullptr;
-
+
// ask the value
return value().get(key);
}
-
+
/**
* Overwrite the value at a certain string index
* @param key
@@ -452,14 +452,14 @@ public:
{
// get the current value
Value current(this->value());
-
+
// add the value
current[key] = value;
-
+
// pass this to the base
_parent->set(_index, current);
}
-
+
/**
* Overwrite the value at a certain numeric index
* @param index
@@ -469,10 +469,10 @@ public:
{
// get the current value
Value current(this->value());
-
+
// add the value
current[index] = value;
-
+
// pass this to the base
_parent->set(_index, current);
}
@@ -486,10 +486,10 @@ public:
{
// get the current value
Value current(this->value());
-
+
// add the value
current[key] = value;
-
+
// pass this to the base
_parent->set(_index, current);
}
@@ -510,20 +510,20 @@ public:
{
// if the current property does not even exist, we do not have to add anything
if (!exists()) return;
-
+
// get the current value
Value current(this->value());
-
+
// skip if the property does not exist
if (!current.contains(index)) return;
-
+
// remove the index
current.unset(index);
-
+
// pass the new value to the base
_parent->set(_index, current);
}
-
+
/**
* Unset a member by its key
* @param key
@@ -532,16 +532,16 @@ public:
{
// if the current property does not even exist, we do not have to add anything
if (!exists()) return;
-
+
// get the current value
Value current(this->value());
-
+
// skip if the property does not exist
if (!current.contains(key)) return;
-
+
// remove the index
current.unset(key);
-
+
// pass the new value to the base
_parent->set(_index, current);
}
@@ -554,16 +554,16 @@ public:
{
// if the current property does not even exist, we do not have to add anything
if (!exists()) return;
-
+
// get the current value
Value current(this->value());
-
+
// skip if the property does not exist
if (!current.contains(key)) return;
-
+
// remove the index
current.unset(key);
-
+
// pass the new value to the base
_parent->set(_index, current);
}
@@ -579,22 +579,22 @@ protected:
* Move constructor
* @param value Other element
*/
-// HashMember(HashMember<Type> &&member) _NOEXCEPT :
+// HashMember(HashMember<Type> &&member) _NOEXCEPT :
// _parent(std::move(member._parent)), _index(std::move(member._index)) {}
private:
/**
* Base value
- * @var
+ * @var
*/
HashParent *_parent;
-
+
/**
* The original index
* @var Type
*/
Type _index;
-
+
/**
* Friend classes
*/
@@ -614,9 +614,8 @@ private:
std::ostream &operator<<(std::ostream &stream, const HashMember<int> &value);
std::ostream &operator<<(std::ostream &stream, const HashMember<std::string> &value);
-
+
/**
* End of namespace
*/
}
-
diff --git a/include/hashparent.h b/include/hashparent.h
index 5ba05bd..b07a8f7 100644
--- a/include/hashparent.h
+++ b/include/hashparent.h
@@ -5,7 +5,7 @@
* array-access variables ([]). When the value of a hash-member is changed,
* it will call one of the methods from this class to set the new property
*
- * This is an internal class that you normally not need when writing
+ * This is an internal class that you normally not need when writing
* extensions. It is used by the PHP-CPP library when you use constructs
* like value["x"]["y"] = 10;
*
@@ -17,7 +17,7 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Forwards
*/
@@ -26,7 +26,7 @@ class Value;
/**
* Class definition
*/
-class HashParent
+class PHPCPP_EXPORT HashParent
{
protected:
/**
@@ -34,41 +34,41 @@ protected:
* objects themselved. Use a Value object instead.
*/
HashParent() {}
-
+
public:
/**
* Destructor
*/
virtual ~HashParent() {}
-
+
/**
* Check if a certain key exists in the array/object
* @param key
* @return bool
*/
virtual bool contains(const std::string &key) const = 0;
-
+
/**
* Check if a certain index exists in the array/object
* @param key
* @return bool
*/
virtual bool contains(int index) const = 0;
-
+
/**
* Check if a certain index exists in the array/object
* @param key
* @return bool
*/
virtual bool contains(const Value &index) const = 0;
-
+
/**
* Retrieve the value at a string index
* @param key
* @return Value
*/
virtual Value get(const std::string &key) const = 0;
-
+
/**
* Retrieve the value at a numeric index
* @param index
@@ -82,34 +82,34 @@ public:
* @return Value
*/
virtual Value get(const Value &key) const = 0;
-
+
/**
* Overwrite the value at a certain string index
* @param key
* @param value
*/
virtual void set(const std::string &key, const Value &value) = 0;
-
+
/**
* Overwrite the value at a certain numeric index
* @param index
* @param value
*/
virtual void set(int index, const Value &value) = 0;
-
+
/**
* Overwrite the value at a certain variant index
* @param key
* @param value
*/
virtual void set(const Value &key, const Value &value) = 0;
-
+
/**
* Unset a member by its index
* @param index
*/
virtual void unset(int index) = 0;
-
+
/**
* Unset a member by its key
* @param key
@@ -121,11 +121,10 @@ public:
* @param key
*/
virtual void unset(const Value &key) = 0;
-
+
};
/**
* End namespace
*/
}
-
diff --git a/include/ini.h b/include/ini.h
index 69137a2..592fba3 100644
--- a/include/ini.h
+++ b/include/ini.h
@@ -3,7 +3,7 @@
*
* Class that can be instantiated in the get_module() startup function to
* define settings from the php.ini file that are supported.
- *
+ *
* @copyright 2014 Copernica BV
*/
@@ -21,18 +21,18 @@ namespace Php {
/**
* Class definition
*/
-class Ini
+class PHPCPP_EXPORT Ini
{
public:
/**
* Supported place-types for ini setting
- *
+ *
* The possible settings for where the configuration can be changed are:
* PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_SYSTEM and PHP_INI_ALL
- *
- * Usually you would choose where the setting can be changed based on how
- * it is used. For example if you want to access the setting during RINIT
- * stage then you would want PHP_INI_PERDIR because the setting would have
+ *
+ * Usually you would choose where the setting can be changed based on how
+ * it is used. For example if you want to access the setting during RINIT
+ * stage then you would want PHP_INI_PERDIR because the setting would have
* no use after RINIT.
*/
enum Place : int {
@@ -44,7 +44,7 @@ public:
/**
* Constructors for string values
- *
+ *
* @param name Name of the php.ini variable
* @param value Default value
* @param orig Original value (if the user resets the variable, it is set back to this value)
@@ -58,7 +58,7 @@ public:
/**
* Constructors for bool values
- *
+ *
* @param name Name of the php.ini variable
* @param value Default value
* @param orig Original value (if the user resets the variable, it is set back to this value)
@@ -72,7 +72,7 @@ public:
/**
* Constructors for integer values
- *
+ *
* @param name Name of the php.ini variable
* @param value Default value
* @param orig Original value (if the user resets the variable, it is set back to this value)
@@ -98,7 +98,7 @@ public:
/**
* Constructors for floating point values
- *
+ *
* @param name Name of the php.ini variable
* @param value Default value
* @param orig Original value (if the user resets the variable, it is set back to this value)
@@ -134,7 +134,7 @@ private:
// cast to a string
return ( static_cast<bool>(value) ? "On" : "Off");
}
-
+
/**
* ini entry name
* @var std::string
@@ -158,7 +158,7 @@ private:
* @var bool
*/
bool _orig_empty = false;
-
+
/**
* Place where the configuration can be changed
* @var Place
@@ -172,4 +172,3 @@ private:
* End of namespace
*/
}
-
diff --git a/include/inivalue.h b/include/inivalue.h
index fc3bc8f..9afb1a2 100644
--- a/include/inivalue.h
+++ b/include/inivalue.h
@@ -2,7 +2,7 @@
* IniValue.h
*
* Class IniValue designed for extracting values from ini entries
- *
+ *
* @copyright 2014 Copernica BV
*/
@@ -14,12 +14,12 @@ namespace Php {
/**
* Class IniValue designed for extracting values from ini entries.
*/
-class IniValue
+class PHPCPP_EXPORT IniValue
{
public:
/**
* Constructors
- *
+ *
* @param name Name of the php.ini variable
* @param isorig Is the original value
*/
@@ -51,7 +51,7 @@ public:
{
return numericValue();
}
-
+
/**
* Cast to a boolean
* @return boolean
@@ -60,7 +60,7 @@ public:
{
return boolValue();
}
-
+
/**
* Cast to a string
* @return string
@@ -69,7 +69,7 @@ public:
{
return stringValue();
}
-
+
/**
* Cast to byte array
* @return const char *
@@ -78,7 +78,7 @@ public:
{
return rawValue();
}
-
+
/**
* Cast to a floating point
* @return double
@@ -96,7 +96,7 @@ public:
* @return int64_t
*/
int64_t numericValue() const;
-
+
/**
* Boolean value
* @return bool
@@ -121,10 +121,10 @@ public:
*/
const char *rawValue() const;
-
+
private:
-
-
+
+
/**
* ini entry name
* @var std::string
@@ -151,4 +151,3 @@ std::ostream &operator<<(std::ostream &stream, const IniValue &ini_val);
* End of namespace
*/
}
-
diff --git a/include/interface.h b/include/interface.h
index 01bb6f5..ecb011e 100644
--- a/include/interface.h
+++ b/include/interface.h
@@ -13,7 +13,7 @@ namespace Php {
/**
* Class definition
*/
-class Interface : private ClassBase
+class PHPCPP_EXPORT Interface : private ClassBase
{
public:
/**
@@ -21,12 +21,12 @@ public:
* @param name
*/
Interface(const char *name) : ClassBase(name, ClassType::Interface) {}
-
+
/**
* Destructor
*/
virtual ~Interface() {}
-
+
/**
* Add a - of course abstract - method to the interface
* @param name Name of the method
@@ -37,7 +37,7 @@ public:
{
// call base
ClassBase::method(name, Abstract | Public, arguments);
-
+
// return self
return *this;
}
@@ -58,7 +58,7 @@ public:
* class, to actually register the interface.
*/
friend class Namespace;
-
+
/**
* All Php::Class<AnyThing> also need access to the base class to
* register an interface.
@@ -70,4 +70,3 @@ public:
* End namespace
*/
}
-
diff --git a/include/iterator.h b/include/iterator.h
index 331c8b3..5d49e1f 100644
--- a/include/iterator.h
+++ b/include/iterator.h
@@ -3,9 +3,9 @@
*
* Base class for iterators. Extension writers that want to create traversable
* classes, should override the Php::Traversable base class. This base class
- * forces you to implement a getIterator() method that returns an instance of
+ * forces you to implement a getIterator() method that returns an instance of
* a Php::Iterator class.
- *
+ *
* In this file you find the signature of the Php::Iterator class. It mostly has
* pure virtual methods, which means that you should create a derived class
* that implements all these methods.
@@ -22,7 +22,7 @@ namespace Php {
/**
* Class definition
*/
-class Iterator
+class PHPCPP_EXPORT Iterator
{
public:
/**
@@ -30,40 +30,40 @@ public:
* @param base Class over which the iterator is iterating
*/
Iterator(Base *base) : _object(base) {}
-
+
/**
* Destructor
*/
virtual ~Iterator() {}
-
+
/**
* Is the iterator on a valid position
* @return bool
*/
virtual bool valid() = 0;
-
+
/**
* The value at the current position
* @return Value
*/
virtual Value current() = 0;
-
+
/**
* The key at the current position
* @return Value
*/
virtual Value key() = 0;
-
+
/**
* Move to the next position
*/
virtual void next() = 0;
-
+
/**
* Rewind the iterator to the front position
*/
virtual void rewind() = 0;
-
+
protected:
/**
* During the lifetime of the iterator, the object over which
@@ -72,9 +72,9 @@ protected:
* @var Value
*/
Value _object;
-
+
};
-
+
/**
* End namespace
*/
diff --git a/include/modifiers.h b/include/modifiers.h
index e52bd14..98140bb 100644
--- a/include/modifiers.h
+++ b/include/modifiers.h
@@ -16,19 +16,19 @@ namespace Php {
/**
* The modifiers are constants
*/
-extern const int Static;
-extern const int Abstract;
-extern const int Final;
-extern const int Public;
-extern const int Protected;
-extern const int Private;
-extern const int Const;
+extern PHPCPP_EXPORT const int Static;
+extern PHPCPP_EXPORT const int Abstract;
+extern PHPCPP_EXPORT const int Final;
+extern PHPCPP_EXPORT const int Public;
+extern PHPCPP_EXPORT const int Protected;
+extern PHPCPP_EXPORT const int Private;
+extern PHPCPP_EXPORT const int Const;
/**
* Modifiers that are supported for methods and properties
*/
-extern const int MethodModifiers;
-extern const int PropertyModifiers;
+extern PHPCPP_EXPORT const int MethodModifiers;
+extern PHPCPP_EXPORT const int PropertyModifiers;
/**
* End namespace
diff --git a/include/namespace.h b/include/namespace.h
index 4bb23db..bdfb8c6 100644
--- a/include/namespace.h
+++ b/include/namespace.h
@@ -1,9 +1,9 @@
/**
* Namespace.h
- *
+ *
* Class that can be used to group various functions and classes into one
* namespace.
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2014 Copernica BV
*/
@@ -21,7 +21,7 @@ class NativeFunction;
/**
* Class definition
*/
-class Namespace
+class PHPCPP_EXPORT Namespace
{
protected:
/**
@@ -41,13 +41,13 @@ protected:
* @var list
*/
std::list<std::shared_ptr<ClassBase>> _classes;
-
+
/**
* Constants defined in the namespace
* @var list
*/
std::list<std::shared_ptr<Constant>> _constants;
-
+
/**
* Namespaces defined inside the namespace
* @var list
@@ -56,19 +56,19 @@ protected:
/**
* Is the object locked?
- *
+ *
* After the object is locked, no more elements can be added to it.
* This happens after the call to get_module - it the no longer makes
* sense to add more objects. When 'apache reload' is executed, the
* get_module() function is called for a second (or third, or fourth)
* time, but the classes, functions and namespaces will then not be
* filled.
- *
+ *
* @var bool
*/
virtual bool locked() const
{
- // by default, namespaces are not locked (only derived extension
+ // by default, namespaces are not locked (only derived extension
// objects can end up in a locked state
return false;
}
@@ -80,12 +80,12 @@ public:
* @param name Name of the namespace
*/
Namespace(const char *name) : _name(name) {}
-
+
/**
* Destructor
*/
virtual ~Namespace() {}
-
+
/**
* Add a native function directly to the namespace
* @param name Name of the function
@@ -97,7 +97,7 @@ public:
Namespace &add(const char *name, const native_callback_1 &function, const Arguments &arguments = {});
Namespace &add(const char *name, const native_callback_2 &function, const Arguments &arguments = {});
Namespace &add(const char *name, const native_callback_3 &function, const Arguments &arguments = {});
-
+
/**
* Add a native class to the namespace by moving it
* @param type The class implementation
@@ -108,10 +108,10 @@ public:
{
// skip when locked
if (locked()) return *this;
-
+
// make a copy of the object, and add it to the list of classes
_classes.push_back(std::unique_ptr<ClassBase>(new Class<T>(std::move(type))));
-
+
// allow chaining
return *this;
}
@@ -129,7 +129,7 @@ public:
// and add it to the list of classes
_classes.push_back(std::unique_ptr<ClassBase>(new Class<T>(type)));
-
+
// allow chaining
return *this;
}
@@ -146,7 +146,7 @@ public:
// make a copy and add it to the list of classes
_classes.push_back(std::unique_ptr<ClassBase>(new Interface(std::move(interface))));
-
+
// allow chaining
return *this;
}
@@ -163,11 +163,11 @@ public:
// make a copy and add it to the list of classes
_classes.push_back(std::unique_ptr<ClassBase>(new Interface(interface)));
-
+
// allow chaining
return *this;
}
-
+
/**
* Add a constant to the namespace
* @param constant The constant to add
@@ -180,11 +180,11 @@ public:
// and add it to the list of constants
_constants.push_back(std::unique_ptr<Constant>(new Constant(std::move(constant))));
-
+
// allow chaining
return *this;
}
-
+
/**
* Add a constant to the namespace
* @param constant The constant to add
@@ -197,11 +197,11 @@ public:
// and add it to the list of constants
_constants.push_back(std::unique_ptr<Constant>(new Constant(constant)));
-
+
// allow chaining
return *this;
}
-
+
/**
* Add a namespace to the namespace by moving it
* @param ns The namespace
@@ -214,7 +214,7 @@ public:
// add it to the list of namespaces
_namespaces.push_back(std::unique_ptr<Namespace>(new Namespace(std::move(ns))));
-
+
// allow chaining
return *this;
}
@@ -231,7 +231,7 @@ public:
// make a copy and add it to the list of namespaces
_namespaces.push_back(std::unique_ptr<Namespace>(new Namespace(ns)));
-
+
// allow chaining
return *this;
}
@@ -244,48 +244,47 @@ public:
{
// number of functions in this namespace
int result = _functions.size();
-
+
// number of functions in sub-namespace
for (auto &ns : _namespaces) result += ns->functions();
-
+
// done
return result;
}
/**
* Apply a callback to each registered function
- *
+ *
* The callback will be called with the name of the namespace, and
* a reference to the registered function.
- *
+ *
* @param callback
*/
void functions(const std::function<void(const std::string &ns, NativeFunction &func)> &callback);
-
+
/**
* Apply a callback to each registered class
- *
+ *
* The callback will be called with the name of the namespace, and
* a reference to the registered class.
- *
+ *
* @param callback
*/
void classes(const std::function<void(const std::string &ns, ClassBase &clss)> &callback);
-
+
/**
* Apply a callback to each registered constant
- *
+ *
* The callback will be called with the name of the namespace, and
* a reference to the registered constant
- *
+ *
* @param callback
*/
void constants(const std::function<void(const std::string &ns, Constant &constant)> &callback);
};
-
+
/**
* End namespace
*/
}
-
diff --git a/include/object.h b/include/object.h
index 2eea05b..f8fea74 100644
--- a/include/object.h
+++ b/include/object.h
@@ -12,11 +12,11 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Class definition
*/
-class Object : public Value
+class PHPCPP_EXPORT Object : public Value
{
public:
/**
@@ -33,40 +33,40 @@ public:
/**
* Constructor to create a new instance of a builtin class
- *
+ *
* You can use this constructor if you have created an instance of your
* own class, but has not assigned it to a variable yet. This happens
* for example for classes that are not constructed from PHP userspace,
* but from your own functions:
- *
+ *
* Php::Value yourFunction()
* {
* return Php::Object("MyClass", new MyClass());
* }
- *
+ *
* When you construct objects like this, the __construct function is not
* going to be called. If you want to construct the object just as if it
* was constructed from PHP user space, do this:
- *
+ *
* Php::Value yourFunction()
* {
* return Php::Object("MyClass");
* }
- *
+ *
* @param name Name of the class to instantiate
* @param base C++ object to wrap
*/
Object(const char *name, Base *base);
-
+
/**
* If you already have the zend_class_entry, you can also pass the
* class_entry structure instead of the class name. This constructor
* works exactly like the Object(name, base) constructor mentioned
* above.
- *
+ *
* Note that if you normally use PHP-CPP, you do not have the class_entry,
* so you probably need to pass the name anyway
- *
+ *
* @param entry The PHP class entry
* @param base C++ object to wrap
*/
@@ -86,17 +86,17 @@ public:
/**
* Constructor to create a new instance
- *
+ *
* Note that it was not possible to create a constructor with signature
* Object(const char *name, Args&&... args) because that overrides the
* Object(const char *name, Base *base) constructor.
- *
+ *
* @param name Name of the class to instantiate
* @param args Optional arguments
*/
template <typename ...Args>
Object(const char *name, Value arg0, Args&&... args) : Value() { if (instantiate(name)) call("__construct", arg0, std::forward<Value>(args)...); }
-
+
/**
* Destructor
*/
@@ -110,7 +110,7 @@ public:
{
// throw exception if things are going wrong
if (type != Type::Object) throw FatalError("Changing type of a fixed object variable");
-
+
// call base
return Value::setType(type);
}
@@ -124,17 +124,17 @@ public:
{
// skip self assignment
if (this == &value) return *this;
-
+
// type must be valid
if (value.type() != Type::Object) throw FatalError("Assigning a non-object to an object variable");
-
+
// call base
Value::operator=(value);
// done
return *this;
}
-
+
/**
* Move assignment operator
* @param value
@@ -144,10 +144,10 @@ public:
{
// skip self assignment
if (this == &value) return *this;
-
+
// type must be valid
if (value.type() != Type::Object) throw FatalError("Moving a non-object to an object variable");
-
+
// call base
Value::operator=(std::move(value));
@@ -158,10 +158,10 @@ public:
private:
/**
* Helper method to instantiate an object
- *
+ *
* This method returns true if there is a __construct() function, and
* false otherwise
- *
+ *
* @param name Class name
* @return bool
*/
diff --git a/include/parameters.h b/include/parameters.h
index b464260..3465863 100644
--- a/include/parameters.h
+++ b/include/parameters.h
@@ -1,8 +1,8 @@
/**
* Parameters.h
*
- * Wrapper around parameters that are passed to a
-
+ * Wrapper around parameters that are passed to a
+
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2013 Copernica BV
*/
@@ -20,7 +20,7 @@ class Base;
/**
* Class definition
*/
-class Parameters : public std::vector<Value>
+class PHPCPP_EXPORT Parameters : public std::vector<Value>
{
private:
/**
@@ -32,14 +32,14 @@ private:
protected:
/**
* Protected constructor
- *
+ *
* The constructor is protected because extension programmers are not
* supposed to instantiate parameters objects themselves
- *
+ *
* @param object The 'this' object
*/
Parameters(Base *object) : _object(object) {}
-
+
public:
/**
* Destructor
@@ -60,4 +60,3 @@ public:
* End of namespace
*/
}
-
diff --git a/include/script.h b/include/script.h
index 6aee034..860b9bc 100644
--- a/include/script.h
+++ b/include/script.h
@@ -5,7 +5,7 @@
*
* The difference between directly calling eval() is that the script object
* will first evaluate the string, and then it can be executed multiple times.
- *
+ *
* @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
* @copyright 2014 Copernica BV
*/
@@ -28,26 +28,26 @@ class Opcodes;
/**
* Class definition
*/
-class Script
+class PHPCPP_EXPORT Script
{
public:
/**
* Constructor
- *
+ *
* The constructor will not throw any exceptions, even when invalid
* PHP code is passed to it that can not be evaluated. You should call
* the valid() to find out if the script was valid (could be parsed).
- *
+ *
* @param name Name of the PHP script
- * @param source PHP source code to be evaluated
+ * @param source PHP source code to be evaluated
* @param size Length of the source code
*/
Script(const char *name, const char *source, size_t size) _NOEXCEPT;
-
+
/**
* Alternative constructor without a size
* @param name Name of the PHP script
- * @param source PHP source code to be evaluated
+ * @param source PHP source code to be evaluated
*/
Script(const char *name, const char *source) _NOEXCEPT : Script(name, source, ::strlen(source)) {}
@@ -63,38 +63,38 @@ public:
* @param source PHP source code to be evaluated
*/
Script(const char *source) _NOEXCEPT : Script("Unknown", source, ::strlen(source)) {}
-
+
/**
* Constructor based on a std::string
* @param source PHP source code to be evaluated
*/
Script(const std::string &source) _NOEXCEPT : Script("Unknown", source.c_str(), source.size()) {}
-
+
/**
* Destructor
*/
virtual ~Script();
-
+
/**
* Is the script a valid PHP script without syntax errors?
* @return bool
*/
bool valid() const;
-
+
/**
* Execute the script
* The return value of the script is returned
* @return Value
*/
Value execute() const;
-
+
private:
/**
* The opcodes
* @var Opcodes
*/
Opcodes *_opcodes;
-
+
/**
* Helper function to compile the source code
* @param name name of the script
@@ -105,7 +105,7 @@ private:
static struct _zend_op_array *compile(const char *name, const char *phpcode, size_t size);
};
-
+
/**
* End of namespace
*/
diff --git a/include/serializable.h b/include/serializable.h
index ce60d91..fdcffa2 100644
--- a/include/serializable.h
+++ b/include/serializable.h
@@ -16,22 +16,22 @@ namespace Php {
/**
* Class definition
*/
-class Serializable
+class PHPCPP_EXPORT Serializable
{
public:
/**
* Method to serialize the object
*
- * This method should return a string representation of the object that
+ * This method should return a string representation of the object that
* can be passed to the serialize() method and that will revive the object
*
* @return std::string
*/
virtual std::string serialize() = 0;
-
+
/**
* Unserialize the object
- *
+ *
* This method is called as an alternative __construct() method to initialize
* the object. The passed in string parameter in in the format earlier returned
* by a call to serialize()
@@ -46,6 +46,3 @@ public:
* End namespace
*/
}
-
-
- \ No newline at end of file
diff --git a/include/streams.h b/include/streams.h
index c4d5339..997defe 100644
--- a/include/streams.h
+++ b/include/streams.h
@@ -21,11 +21,11 @@ namespace Php {
/**
* Define the out and err objects
*/
-extern std::ostream out;
-extern std::ostream error;
-extern std::ostream notice;
-extern std::ostream warning;
-extern std::ostream deprecated;
+extern PHPCPP_EXPORT std::ostream out;
+extern PHPCPP_EXPORT std::ostream error;
+extern PHPCPP_EXPORT std::ostream notice;
+extern PHPCPP_EXPORT std::ostream warning;
+extern PHPCPP_EXPORT std::ostream deprecated;
/**
* End namespace
diff --git a/include/super.h b/include/super.h
index 07dc4b3..154ae62 100644
--- a/include/super.h
+++ b/include/super.h
@@ -12,29 +12,29 @@
* Set up namespace
*/
namespace Php {
-
+
/**
* Class definition
*/
-class Super
+class PHPCPP_EXPORT Super
{
public:
/**
* Constructor
- *
+ *
* Extension writers do not have to access the super-globals themselves.
* They are always accessible via Php::POST, Php::GET, et cetera.
- *
+ *
* @param index index number
* @param name name of the variable in PHP
*/
Super(int index, const char *name) : _index(index), _name(name) {}
-
+
/**
* Destructor
*/
virtual ~Super() {}
-
+
/**
* Array access operator
* This can be used for accessing associative arrays
@@ -78,7 +78,7 @@ public:
// convert to value, and call begin on the value object
return value().begin();
}
-
+
/**
* Return an iterator for iterating over the variables
* @return iterator
@@ -95,19 +95,19 @@ private:
* @var int
*/
int _index;
-
+
/**
* Name of the variable in PHP
* @var name
*/
const char *_name;
-
+
/**
* Turn the object into a value object
* @return Value
*/
Value value();
-
+
};
/**
@@ -125,4 +125,3 @@ extern Super REQUEST;
* End namespace
*/
}
-
diff --git a/include/traversable.h b/include/traversable.h
index f81a5b4..8ef7f5d 100644
--- a/include/traversable.h
+++ b/include/traversable.h
@@ -17,7 +17,7 @@ namespace Php {
/**
* Class definition
*/
-class Traversable
+class PHPCPP_EXPORT Traversable
{
public:
/**
diff --git a/include/type.h b/include/type.h
index d248455..151919c 100644
--- a/include/type.h
+++ b/include/type.h
@@ -17,7 +17,7 @@ namespace Php {
* Supported types for variables
* The values are the same as the ones used internally in Zend
*/
-enum class Type : unsigned char {
+enum class PHPCPP_EXPORT Type : unsigned char {
Null = 0, // Null will allow any type
Numeric = 1,
Float = 2,
@@ -35,4 +35,3 @@ enum class Type : unsigned char {
* End of namespace
*/
}
-
diff --git a/include/value.h b/include/value.h
index e080df7..40327cd 100644
--- a/include/value.h
+++ b/include/value.h
@@ -38,7 +38,7 @@ template <class Type> class HashMember;
/**
* Class definition
*/
-class Value : private HashParent
+class PHPCPP_EXPORT Value : private HashParent
{
public:
/**
@@ -1228,5 +1228,3 @@ X &operator%=(X &x, const Php::Value &value) { return x %= (X)value; }
* End of namespace
*/
}
-
-
diff --git a/include/valueiterator.h b/include/valueiterator.h
index 95cdac6..92c26aa 100644
--- a/include/valueiterator.h
+++ b/include/valueiterator.h
@@ -24,7 +24,7 @@ class ValueIteratorImpl;
/**
* Class definition
*/
-class ValueIterator
+class PHPCPP_EXPORT ValueIterator
{
public:
/**
@@ -32,13 +32,13 @@ public:
* @param impl Implementation iterator
*/
ValueIterator(ValueIteratorImpl *impl) : _impl(impl) {}
-
+
/**
* Copy constructor
* @param that
*/
ValueIterator(const ValueIterator &that);
-
+
/**
* Destructor
*/
@@ -49,7 +49,7 @@ public:
* @return ValueIterator
*/
ValueIterator &operator++();
-
+
/**
* Increment position (post-increment)
* @return ValueIterator
@@ -58,14 +58,14 @@ public:
{
// make a copy
ValueIterator copy(*this);
-
+
// increment current object
++(*this);
-
+
// and return the unchanged original
return copy;
}
-
+
/**
* Decrement position (pre-decrement)
* @return ValueIterator
@@ -80,14 +80,14 @@ public:
{
// make a copy
ValueIterator copy(*this);
-
+
// decrement current object
--(*this);
-
+
// and return the unchanged original
return copy;
}
-
+
/**
* Compare with other iterator
* @param that
@@ -107,7 +107,7 @@ public:
* @return std::pair
*/
const std::pair<Value,Value> &operator*() const;
-
+
/**
* Dereference, this returns a std::pair with the current key and value
* @return std::pair
@@ -127,4 +127,3 @@ private:
* End namespace
*/
}
-
diff --git a/include/version.h b/include/version.h
index 7038f20..f7e9ea5 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1,7 +1,7 @@
/**
* Version.h
*
- * Macro with API version. The API version number prevents that
+ * Macro with API version. The API version number prevents that
* extensions are loaded that are incompatible with the libphpcpp.so
* library
*
@@ -13,5 +13,3 @@
* Macro with version number (this is incremented with every release)
*/
#define PHPCPP_API_VERSION 20150126
-
-
diff --git a/include/visibility.h b/include/visibility.h
new file mode 100644
index 0000000..afb8a6b
--- /dev/null
+++ b/include/visibility.h
@@ -0,0 +1,30 @@
+/**
+ * visibility.h
+ *
+ * This file defines macros used to define whether a symbol
+ * should be exported. It is only used for classes and
+ * functions that are defined in the public API to reduce
+ * the size of the symbol table, make linking and loading
+ * of the PHP-CPP library faster and generate more
+ * optimized code as a result.
+ *
+ * @copyright 2015 Copernica B.V.
+ */
+
+#if defined _WIN32 || defined __CYGWIN__
+ #ifdef BUILDING_PHPCPP
+ #ifdef __GNUC__
+ #define PHPCPP_EXPORT __attribute__ ((dllexport))
+ #else
+ #define PHPCPP_EXPORT __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
+ #endif
+ #else
+ #ifdef __GNUC__
+ #define DLL_EXPORT __attribute__ ((dllimport))
+ #else
+ #define DLL_EXPORT __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
+ #endif
+ #endif
+#else
+ #define PHPCPP_EXPORT __attribute__ ((visibility ("default")))
+#endif
diff --git a/phpcpp.h b/phpcpp.h
index 16c1690..b5385a7 100644
--- a/phpcpp.h
+++ b/phpcpp.h
@@ -27,6 +27,7 @@
/**
* Include all headers files that are related to this library
*/
+#include <phpcpp/visibility.h>
#include <phpcpp/noexcept.h>
#include <phpcpp/platform.h>
#include <phpcpp/version.h>
@@ -41,7 +42,6 @@
#include <phpcpp/valueiterator.h>
#include <phpcpp/array.h>
#include <phpcpp/object.h>
-#include <phpcpp/hiddenpointer.h>
#include <phpcpp/globals.h>
#include <phpcpp/argument.h>
#include <phpcpp/byval.h>
@@ -69,13 +69,4 @@
#include <phpcpp/file.h>
#include <phpcpp/function.h>
-/**
- * Macro to export a function
- */
-#if defined(__GNUC__) && __GNUC__ >= 4
-# define PHPCPP_EXPORT __attribute__ ((visibility("default")))
-#else
-# define PHPCPP_EXPORT
-#endif
-
#endif /* phpcpp.h */
diff --git a/include/hiddenpointer.h b/zend/hiddenpointer.h
index 955e7d7..d2636e3 100644
--- a/include/hiddenpointer.h
+++ b/zend/hiddenpointer.h
@@ -180,4 +180,3 @@ private:
* End of namespace
*/
}
-
diff --git a/zend/includes.h b/zend/includes.h
index c092a07..aed5ed0 100644
--- a/zend/includes.h
+++ b/zend/includes.h
@@ -47,6 +47,7 @@
/**
* Include other files from this library
*/
+#include "../include/visibility.h"
#include "../include/noexcept.h"
#include "../include/platform.h"
#include "../include/version.h"
@@ -61,7 +62,6 @@
#include "../include/valueiterator.h"
#include "../include/array.h"
#include "../include/object.h"
-#include "../include/hiddenpointer.h"
#include "../include/globals.h"
#include "../include/argument.h"
#include "../include/byval.h"
@@ -98,6 +98,7 @@
/**
* Specific zend implementation files for internal use only
*/
+#include "hiddenpointer.h"
#include "init.h"
#include "callable.h"
#include "nativefunction.h"