您需要使用get_class_vars(),它返回一个包含所提供类的所有属性(类变量)的关联数组,变量名作为键。使用类中的get_class_vars( get_called_class() ) 以字符串形式获取该类的名称。 get_class( $this ) 也可以。
当然,这会为您提供所有类的属性(无论访问控制修饰符如何),因此您可能还想过滤此列表。一个简单(如果有点混淆)的方法是按照this SE Answer 使用array_intersect_key() 和array_flip()。所以整个事情看起来像:
array_intersect_key( get_class_vars( get_called_class() ), array_flip( array( 'var_1', 'var_2', 'var_3' ) ) );
您必须决定生成的代码是否真的值得。正如@ircmaxell 指出的那样,阅读array( 'var_1' => $this->var_1, 'var_2' => $this->var_2 ); 可能更容易。
但是,因为 a) 我喜欢 Yak Shaving 和 b) 因为我是一个非常勤奋的 lazy programmer 和 c) Perl 中可能有一个单行代码可以优雅地做到这一点,这里是上下文中的代码我试图解决的问题:用同一类的许多(但不是全部)其他属性覆盖关联数组(这也是当前类的属性)。
<?php
class Test {
protected $var_1 = 'foo';
private $var_2 = 'bar';
public $var_3 = 'baz';
private $ignored_var = 'meh';
public $ary = array(
'var_1' => 'bletch',
'var_2' => 'belch',
'var_4' => 'gumbo',
'var_5' => 'thumbo'
);
public function test(){
$override = array_intersect_key( get_class_vars( get_called_class() ), array_flip( array( 'var_1', 'var_2', 'var_3' ) ) );
return array_merge( $this->ary, $override );
}
}
$test = new Test();
var_dump( $test->test() );
产生预期的输出:
array(5) { ["var_1"]=> string(3) "foo" ["var_2"]=> string(3) "bar" ["var_4"]=> string(5) "gumbo" ["var_5"]=> string(6) "thumbo" ["var_3"]=> string(3) "baz" }
请注意,在我自己的用法中,我不会将其分成两行,但我想将引用 OP 的代码分开。