如何在PHP中创建最终变量?

时间:2016-12-29 14:16:52

标签: php final php-7

我无法找到,或者我错误地思考但是我需要创建一个无法更改的变量,例如只读:

final $finalVar = 'extremely secret number'; // don't change

$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !

4 个答案:

答案 0 :(得分:2)

除了常量(如评论中所述),我能想到的唯一方法是使用具有private变量的父子关系

class ParentC {
    private $var = 'bob';
}

class ChildC extends ParentC {
    public function setVar() {
         // Fatal error: Uncaught Error: Cannot access private property ParentC::$var
         echo parent::$var; 
    }
}

请注意,a hacky way around that使用Reflection类。但是,在大多数情况下,您无法触及子类的private父变量

答案 1 :(得分:1)

虽然至少从2012年开始有talk个只读变量,即使有RFC在对象上提出它,但该语言中不存在支持。

实现只读变量(或只读变量的集合,对于某些配置值可能很重要)的一种方法是使用中介容器:

class Readonly {
    public function __construct(...$vars) {
        $this->vars;
    }

    public function __set($var, $value) {
        if (array_key_exists($var, $this->vars)) {
            throw new \LogicException("Variable $var is read-only");
        } else {
            $this->vars[$var] = $value;
        }
    }

    public function __get($var) {
        return array_key_exists($var, $this->vars) ? $this->vars[$var] : null;
    }

    protected $vars = [];
}

允许您创建只读变量的容器:

$config = new Readonly('apikey');

$config->apikey = 'A01AB020'; // this works, first time set
echo $config->apikey;

$config->apikey = '00000000'; // boom! it's "final"

答案 2 :(得分:1)

如果要创建不想更改的变量,可以使用常量:

class MyClass {

   const VERSION = '2.1'; // This constant can be view outside the class,
                          // but its value can't be changed even in this class

   function myMethod () {
       echo self::VERSION; // Inside class
   }

}

或在课堂外:

echo MyClass::VERSION;

功能方法:

define ('VERSION', '2.1');

echo VERSION;

答案 3 :(得分:0)

使用常量:

defined('VARIABLE')  OR define('VARIABLE', 'value');

文档:define defined