Wednesday, March 23, 2011

Share Constants Between PHP and JavaScript

I have several constants in a PHP application I'm developing. I've defined a Constants class and the defined the constants as const VAR_NAME = value; in this class. I would like to share these constants between my JavaScript and PHP code. Is there a DRY (Don't Repeat Yourself) mechanism to share them?

class Constants {
    const RESOURCE_TYPE_REGSITER = 2;
    const RESOURCE_TYPE_INFO = 1;
}
From stackoverflow
  • I would use json_encode. You will have to convert the class to an associative array first.

    $constants = array("RESOURCE_TYPE_REGISTER"=>2, "RESOURCE_TYPE_INFO"=>2);
    echo json_encode($constants);
    

    You could also use reflection to convert the class to an associative array if you would prefer to use a class.

    function get_class_consts($class_name)
    {
        $c = new ReflectionClass($class_name);
        return ($c->getConstants());
    }
    
    class Constants {
        const RESOURCE_TYPE_REGSITER = 2;
        const RESOURCE_TYPE_INFO = 1;
    }
    
    echo json_encode(get_class_consts("Constants"));
    
    Gumbo : You mixed JavaScript and PHP syntax. There is no JSON object in PHP. There are just json_*() functions.
    Adam Peck : Oops. I have updated it so there is no confusion :D
    Brian Fisher : This is great, however, get_class_vars seems to skip the const variables in the class.
    Crescent Fresh : Heh. Nice patching.
    Adam Peck : Hey at least it's right now :) Although I still think the simplest way is to leave it in an associative array. And this time I actually tested it too!
    Brian Fisher : Thanks, this works great. I like using the const member variables instead of an associative array, because my IDE can then do code completion.
  • The only way you can share the constants is to have the php side inform the javascript. For instance:

    echo "<script> var CONSTANT1 =".$constant_instance->CONSTANT_NAME.";</script>";
    

    Or using ajax, you could also write a small script that would return the constants as JSON/whatever.

  • A bit of an ugly hack, but here it goes:

    constants.js

    //<?php
    $const1 = 42;
    $const2 = "Hello";
    //?>
    

    constants.html (use inside JavaScript)

    <script type="text/javascript" src="constants.js"></script>
    <script type="text/javascript">document.write($const1);</script>
    

    constants.php (use inside PHP)

    <?php
    ob_start(); // start buffering the "//"
    require "constants.js";
    ob_end_clean(); // discard the buffered "//"
    
    echo $const1;
    ?>
    
    Ates Goral : I knew this answer would get downvotes! :)

0 comments:

Post a Comment