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

问题描述 投票:4回答:3

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

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

$finalVar = 'hacked...'; // THROW I GIANT BIG ERROR HERE !
php final php-7
3个回答
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; 
    }
}

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


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"

0
投票

使用常数:

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

文档:define defined


0
投票

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

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;
© www.soinside.com 2019 - 2024. All rights reserved.