什么是“试图在..中获取非对象的属性”卑鄙?

时间:2019-10-15 作者:Edu Sorel

我在我的网络中移动了一些东西,以便在我的所有图像中添加一个类,现在我收到了以下消息:

【2019年10月15日10:44:01 UTC】PHP通知:尝试在/home/public\\u html/wp includes/nav菜单中获取非对象的属性“post\\u title”。php在线825

【2019年10月15日10:44:01 UTC】PHP注意:尝试在/home/public\\html/wp includes/nav菜单中获取非对象的属性“ID”。php在线825

【2019年10月15日10:44:01 UTC】PHP注意:尝试在/home/public\\html/wp includes/nav菜单中获取非对象的属性“ID”。php在线829

会发生什么?我已回滚,但消息仍然显示。危险吗?

3 个回复
SO网友:Tom J Nowell

这里的根本问题是假设。

例如,假设这里有一个数组:

$test = [
    \'foo\' => \'bar\'
];
如果我们跑步echo $test[\'foo\']; 我们应该看到条形图,但如果我们运行echo $test[\'bananas\'];? 该数组中没有香蕉条目,因此PHP会注意到这一点,抛出一个与您看到的类似的警告/通知,然后用\'\'null.

对象也会发生这种情况,例如,如果我们使用经典的post对象并尝试这样做:echo $post->odijfnvlkdsfnvlkjdsnvkljdfnv;, 我们会收到警告/通知

您的代码也是如此。最有可能的是,代码调用API,但从不检查它是否成功,而只是假设它成功。或者,变量拼写错误。

你可以用警卫检查这些东西,比如if ( !empty( ... ) ) {, 或者通过检查WP函数的返回值,查看它们是否返回了您期望的值,或者是否出现了问题。

会发生什么?我已回滚,但消息仍然显示。危险吗?

是或否,这可能会产生后果,这在很大程度上取决于你在做什么以及它如何相互作用。因为您假设值是好的,而不是好的,或者使用不存在的东西,PHP将替换占位符值。该值为false-这可能会打乱你的逻辑,或导致意想不到的情况。这可能是神秘的错误,或者是利用安全性的途径。

最大的问题是当PHP配置为在前端显示这些警告时,这可能会破坏RESTXMLRPC和AJAX,以及任何更改HTTP头的操作

然而,最恼人的问题是,由于PHP错误日志会产生大量警告,因此几乎不可能进行调试。任何感兴趣的内容都会淹没在大量关于对象属性和数组键是不存在的访问的通知中。

SO网友:butlerblog

您的通知中列出的属性都是$post 对象注意事项表明,如果使用此功能$post 未定义对象(即,它不是现有对象)。

这可能是插件/主题和/或这些东西的组合或自定义代码的结果。根据您的描述(“我在我的网站上移动了一些东西,以便在我的所有图像中添加一个类”),您所做的可能是打算使用$post 对象,但实际上并没有在您尝试使用它的位置定义它。

这可能很简单,只需将其作为“全局”变量应用于代码中(假设这是一个代码片段)。如果是,请尝试添加以下内容:

global $post;
或者,提供更多关于您所做更改(以及更改之前所做的更改)的详细信息。

SO网友:Kevin Leary

如果在主题模板之外的函数中看到这种情况,则添加global $post; 到函数顶部可能会起作用。

如果发生在单个主题模板上,请首先确保使用$post 对象之后的the_post() 函数调用。

也可能是您试图使用$post 对象位于没有该对象的页面上。这可能包括搜索结果、404、归档和任何其他不生成单个$post对象的场景。在这些情况下,我通过检查$post 对象是的有效实例WP_Post 类别:

is_a($post, \'WP_Post\')
下面是我通常使用这种方法的一个工作示例:

/**
 * Hero Lead-in
 */
function hero_leadin() {
  global $post;

  // No $post object exists
  if ( ! is_a($post, \'WP_Post\') ) return;
  
  return get_field(\'hero__lead-in\');
}
如果我的主题是header.php 使用此hero_leadin() 功能,它不会导致trying to get property \'id\' of non-object PHP通知。

相关推荐

WooThemes-供应商/预订-允许供应商管理资源

我正在尝试从WooThemes为bookings插件带来新功能。在组合预订和供应商插件时,不允许供应商用户管理资源(资源是自定义帖子)。我将新功能添加到资源自定义帖子中,然后将这些功能添加到供应商角色(通过用户角色插件)现在,资源显示在供应商角色的管理菜单中,但当我尝试添加新资源时,会出现“您无权访问此页面”错误。我添加的新功能:https://i.stack.imgur.com/OCDlV.png添加到角色的功能:https://i.stack.imgur.com/5t696.png使用角色登录时显示的