Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
152 lines (130 sloc) 4.52 KB

Constants

In PHP scripts you can define constants - both global constants and class level constants. This can also be done with PHP-CPP. If you want to expose constants to user space PHP code, you can do that by adding the constants to the Php::Extension object inside the get_module() call.

#include <phpcpp.h>

/**
 *  Switch to C context so that the get_module() function can be
 *  called by C programs (which the Zend engine is)
 */
extern "C" {
    /**
     *  Startup function for the extension
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("my_extension", "1.0");

        // add integer constants
        myExtension.add(Php::Constant("MY_CONSTANT_1", 1));
        myExtension.add(Php::Constant("MY_CONSTANT_2", 2));

        // floating point constants
        myExtension.add(Php::Constant("MY_CONSTANT_3", 3.1415927));
        myExtension.add(Php::Constant("MY_CONSTANT_4", 4.932843));

        // string constants
        myExtension.add(Php::Constant("MY_CONSTANT_5", "This is a constant value"));
        myExtension.add(Php::Constant("MY_CONSTANT_6", "Another constant value"));

        // null constants
        myExtension.add(Php::Constant("MY_CONSTANT_7", nullptr));

        // return the extension
        return myExtension;
    }
}

It is all very straight forward. Using the constants in a PHP script is just as easy:

<?php
    echo(MY_CONSTANT_1."\n");
    echo(MY_CONSTANT_2."\n");
    echo(MY_CONSTANT_3."\n");
    echo(MY_CONSTANT_4."\n");
    echo(MY_CONSTANT_5."\n");
    echo(MY_CONSTANT_6."\n");
    echo(MY_CONSTANT_7."\n");
?>

PHP also supports the concept of class level constants. Internally, in the Zend engine, class level constants are implemented as regular class members, but instead of a "public" or "private" flag, a constant property is marked with a "constant" flag. PHP-CPP exposes this too. You can register class properties with a Php::Const flag.

Besides this, a Php::Class instance also has a "constant" method, and you can add instances of Php::Constant to the class. Semantically, all these three ways to create class level constants are identical.

/**
 *  The C++ class that we're going to expose
 *
 *  (For this example we use a completely empty class, as only examples
 *  are given on how to use constants)
 */
class Dummy : public Php::Base
{
};

/**
 *  Switch to C context so that the get_module() function can be
 *  called by C programs (which the Zend engine is)
 */
extern "C" {
    /**
     *  Startup function for the extension
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("my_extension", "1.0");

        // create a class objects
        Php::Class<Dummy> dummy("Dummy");

        // there are many different ways to add constants, but semantically,
        // they're all the same
        dummy.property("MY_CONSTANT_1", 1, Php::Const);
        dummy.property("MY_CONSTANT_2", "abcd", Php::Const);
        dummy.constant("MY_CONSTANT_3", "xyz");
        dummy.constant("MY_CONSTANT_4", 3.1415);
        dummy.add(Php::Constant("MY_CONSTANT_5", "constant string"));
        dummy.add(Php::Constant("MY_CONSTANT_5", true));

        // add the class to the extension
        myExtension.add(std::move(dummy));

        // return the extension
        return myExtension;
    }
}

Runtime constants

If you want to find out the value of a user space constant at runtime from your C++ code, or when you want to find out if a constant is defined or not, you can simply use the Php::constant() or Php::defined() functions. To define constants at runtime, use Php::define():

/**
 *  Function that can be called from a PHP script
 */
void example_function()
{
    // check if a certain user space constant is defined
    if (Php::defined("USER_SPACE_CONSTANT"))
    {
        // retrieve the value of a constant
        Php::Value constant = Php::constant("ANOTHER_CONSTANT");

        // define other constants at runtime
        Php::define("DYNAMIC_CONSTANT", 12345);
    }
}

/**
 *  Switch to C context so that the get_module() function can be
 *  called by C programs (which the Zend engine is)
 */
extern "C" {
    /**
     *  Startup function for the extension
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension myExtension("my_extension", "1.0");

        // add a function to the extension
        extension.add("example_function", example_function);

        // return the extension
        return myExtension;
    }
}
You can’t perform that action at this time.