Are private constants possible in PHP?

PhpConstantsPrivate

Php Problem Overview


PHP does not allow

class Foo
{
    private const my_private_const;

but of course allows

const my_const;

So in effect constants are global because I can access my_const anywhere using Foo::my_const

Is there a way to make private constants?

Php Solutions


Solution 1 - Php

Folks! PHP 7.1.0 has been released

Now it's possible to have visibility modifiers with class constants.

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>

Output of the above example in PHP 7.1:

bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in

Solution 2 - Php

The answer is a simple "no". PHP doesn't support this concept. The best you can do is a private static variable in the class, which isn't as good of course because it's not readonly. But you just have to work around it.

Edit

Your question got me thinking - here's something I've never tried, but might work. Put another way "this is untested". But say you wanted a "private constant" called FOO:

// "Constant" definitions
private function __get($constName){
    // Null for non-defined "constants"
    $val = null;
    
    switch($constName){
        case 'FOO':
            $val = 'MY CONSTANT UNCHANGEABLE VALUE';
            break;
        case 'BAR':
            $val = 'MY OTHER CONSTANT VALUE';
            break;
    }
    
    return $val;
}

Of course your syntax would look a bit odd:

// Retrieve the "constant"
$foo = $this->FOO;

...but at least this wouldn't work:

$this->FOO = 'illegal!';

Maybe something worth trying?

Cheers

Solution 3 - Php

Note, that visibility modifiers for class constants have been added in PHP 7.1.

RFC: Support Class Constant Visibility

Solution 4 - Php

A simplified version of @Madbreaks' workaround: write a private static function that returns the value of your private "constant":

private static function MY_CONSTANT() {
    return "constant string";
}

Usage:

public static function DoStuff() {
    echo self::MY_CONSTANT();
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser656925View Question on Stackoverflow
Solution 1 - PhpTahir YasinView Answer on Stackoverflow
Solution 2 - PhpMadbreaksView Answer on Stackoverflow
Solution 3 - PhpInvis1bleView Answer on Stackoverflow
Solution 4 - PhpalexanderbirdView Answer on Stackoverflow