【问题标题】:wordpress get variable from empty do_actionwordpress 从空的 do_action 获取变量
【发布时间】:2019-04-07 02:16:37
【问题描述】:
/* I cant change this part (plugin core files) */
function test123(){
    $secret = "hoho"; //i want to get this variable
    do_action('custom');  //developer didnt pass any variable here
}
/* I cant change this part (plugin core files) */

add_action('custom',function() use ( $secret ) {
    echo $secret; //didn't work
});

test123();

如何获取 $secret 值?因为开发者在使用do_action时没有传递任何变量

【问题讨论】:

  • 显然$secret 仅存在于函数体test123 之外(如问题所示),它不存在于函数范围之外。因此,当你把它交给闭包时,它是未定义的,当你回应它时它什么都不是。

标签: php wordpress function arguments closures


【解决方案1】:

你可以这样使用:

function test123() {
    $secret = 'hoho';
    do_action( 'custom', $secret );
}

add_action('custom',function( $secret ) {
    echo $secret;
});


test123();

希望这行得通!

【讨论】:

  • 嗨,我忘了说我不能改变 test123() 部分
【解决方案2】:

您的变量超出范围

function test123(){
    $secret = "hoho"; //i want to get this variable
    do_action('custom');  //developer didnt pass any variable here
} //end of function scoope

add_action('custom',function() use ( $secret ) { //<-- $secret is undefined
    echo $secret; //didn't work
});

有几种方法可以解决这个问题,但我真的不能说如何在这么少的上下文中。

  • 您可以将add_action 移动到函数中
  • 您可以将$secret 设为全局等。
    • 修改 do 操作调用以发送它
    • 使其成为常数
    • 设为global(关键字)
    • 使其成为维护其状态(静态等)的类的属性

等等,这取决于该值需要有多动态。也许该值是一个静态字符串,也许它只存在于您的函数等中。

调用该函数的次数可能会影响在内部定义它(添加/删除操作)。

您可以轻松测试:

ini_set('display_errors', 1);
error_reporting(E_ALL);

add_action('custom',function() use ( $secret ) {
   echo gettype($secret); //didn't work
});

预期输出

<br />
<b>Notice</b>:  Undefined variable: secret in <b>...</b> on line    <b>...</b><br />

NULL

更新

我无法更改 test123()

我有点想通了,所以我只给出了一般性的解决方案。无论如何,如果它只是该函数中的一个普通的旧局部变量,那么除了以某种方式编辑该函数之外,没有办法在它之外“获取”它的值。这是 PHP 的东西(语言的东西),而不是 WordPress 的东西。它与函数内如何处理范围有关。

也许可以通过其他方式获取该数据,这取决于它是什么。例如它是否存储在数据库中?您也许可以通过这种方式访问​​等等...如果不知道更多关于它是什么,我无法说出如何做到这一点。

编辑原始权限并非不可能。显然这并不理想,但这是可能的。有些提示是从不编辑原件的。如果它是主题的一部分,请尝试通过子主题来实现。如果它是插件,或者子主题不适用于它,那么您可以复制它并更改它的名称。

我应该提一下,这取决于它的许可方式,这可能违反了该许可。

您永远不想编辑原始内容,因为如果您更新“插件/主题”,您可能会完全丢失所做的更改。如果它在副本中,您可以像这样评论您的更改:

 /* START CUSTOM CODE */

当您更新原始“插件/主题”时,您可以轻松找到您更改的位置(通过搜索该评论文本)并将它们用于新版本的“插件/主题”。这可能就像处理所有文件一样简单,但您更改的文件(如果没有更改)等等。

正如我所说,这并不理想,但它会起作用。这仅取决于您想要实现它的程度以及维护它的意愿。

另请参阅

https://www.php.net/manual/en/language.variables.scope.php

在用户定义的函数中引入了本地函数范围。默认情况下,函数内部使用的任何变量都仅限于局部函数范围

【讨论】:

  • 嗨,我忘了说我不能改变 test123() 部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2018-01-12
  • 1970-01-01
  • 2021-12-20
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多