【问题标题】:Overriding property with dynamic property variable not working PHP 7.0使用动态属性变量覆盖属性不起作用 PHP 7.0
【发布时间】:2026-02-18 03:45:01
【问题描述】:

从 PHP 5.6 切换到 7.0 时,我需要根据这个脚本来做。我正在尝试按如下方式在 WordPress 中应用重写规则,但遇到了一个奇怪的 PHP 问题。通过变量创建的动态属性在 PHP 7.0 中不起作用。

$rule = [   'name' => 'profile',
            'rule' => 'author_base',
            'rewrite' => 'profile',
            'position' => 'top',
            'replace' => true,
            'dynamic' => true
         ];
global $wp_rewrite;
global $wp;
$wp->add_query_var($rule['name']);
if(isset($rule['replace']) && $rule['replace']) {
    var_dump($rule['rule']); // author_base
    $wp_rewrite->$rule['rule']=$rule['rewrite']; // this doesn't work
    $wp_rewrite->author_base=$rule['profile']; // this works
    var_dump($wp_rewrite->$rule['rule']) // return null => BAD
    var_dump($wp_rewrite->author_base); // returns 'author' => OK
    // In PHP 5.6 Works both including $wp_rewrite->$rule['rule']
} else {
    add_rewrite_rule($rule['rule'], $rule['rewrite'], $rule['position']);
}       

【问题讨论】:

    标签: php php-7


    【解决方案1】:

    这是 php7 的B.C 之一。

    现在将严格按照从左到右的顺序对变量、属性和方法的间接访问进行评估,而不是之前的特殊情况组合。

    | Expression          | PHP 5 interpretation  | PHP 7 interpretation  |
    |---------------------|-----------------------|-----------------------|
    | $foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']() |
    

    所以,改变

    $wp_rewrite->$rule['rule']=$rule['rewrite'];
    var_dump($wp_rewrite->$rule['rule']);
    

    $wp_rewrite->{$rule['rule']}=$rule['rewrite'];
    var_dump($wp_rewrite->{$rule['rule']}); 
    

    【讨论】:

    • 是的,工作,注意到这也适用于 PHP 5.6 和 TH { }