PHP类内部如何使用数组值?为何类内赋值报错类外正常?
PHP类内部使用数组值的问题解析
错误原因
PHP规定,类的属性(包括静态属性)在声明阶段只能使用常量表达式初始化,不能依赖其他类属性的运行时求值结果。你第一个代码里的self::$arr1['key1']属于运行时表达式(需要访问已初始化的类属性并取数组索引),不符合初始化规则,因此报错。
而第二个代码是在类外部赋值,此时类已经完成加载,MyClass::$arr1已经可用,自然能正常访问。
解决方案
方案1:使用静态初始化方法
通过手动调用静态方法,在类加载完成后初始化依赖其他属性的数组:
<?php class MyClass{ public static $arr1 = [ 'key1' => "myString", 'key2' => "aaaa" ]; public static $arr2; // 静态初始化方法 public static function init() { self::$arr2 = [ 'key' => self::$arr1['key1'] ]; } } // 调用初始化方法完成赋值 MyClass::init(); // 正常访问 echo MyClass::$arr2['key']; // 输出 myString
方案2:提取常量复用
如果数组中的值是固定的,可以先定义类常量,再用常量初始化两个数组:
<?php class MyClass{ const KEY1 = "myString"; public static $arr1 = [ 'key1' => self::KEY1, 'key2' => "aaaa" ]; public static $arr2 = [ 'key' => self::KEY1 ]; } echo MyClass::$arr2['key']; // 输出 myString
方案3:使用构造函数(非静态属性场景)
如果是非静态属性,可以在构造函数中初始化依赖值:
<?php class MyClass{ public $arr1 = [ 'key1' => "myString", 'key2' => "aaaa" ]; public $arr2; public function __construct() { $this->arr2 = [ 'key' => $this->arr1['key1'] ]; } } $obj = new MyClass(); echo $obj->arr2['key']; // 输出 myString
内容的提问来源于stack exchange,提问作者Lexxy
相关产品推荐
相关产品推荐

