【问题标题】:Method exists but it can't be called [closed]方法存在但不能调用[关闭]
【发布时间】:2014-09-16 15:52:11
【问题描述】:

我正在使用 vBulletin,我必须使用 vB_datamanger_User 类。 我已经包含了正确的文件并且该类存在。

我必须使用一个名为set_userfields 的方法,但它不存在(在 php 看来)。 奇怪的是,如果我这样做了

$newuser = new vB_DataManager_User($vbulletin,ERRTYPE_ARRAY);
$newuser->set('username',"MyUsername");

有效。

如果我这样做了

var_dump(method_exists($newuser, 'set_userfields'));

它返回bool(true)

但如果我这样做 $newuser->set_userfields(array('field12' => 1)); 它不起作用(没有错误)。

我做错了什么?

编辑:该方法声明为function set_userfields(&$values, $verify = true, $all_fields = 'normal', $skip_unset_required_fields = false)

【问题讨论】:

  • 是私有方法吗?
  • 声明为function set_userfields(&$values, $verify = true, $all_fields = 'normal', $skip_unset_required_fields = false)
  • "it doesn't work" 尝试使用时是否报错?
  • @Edward 不,我没有收到错误消息。我也做过error_reporting(E_ALL);
  • 如果你没有收到错误,为什么你认为它不存在(在php看来)?如果 PHP 认为它不存在,它会因为调用未定义的函数而报错。

标签: php class oop methods vbulletin


【解决方案1】:

如果您的代码如下所示:

<?php

class vB_DataManager_User{
    public function __construct($a, $b){
    }

    function set_userfields(&$values, $verify = true, $all_fields = 'normal', $skip_unset_required_fields = false){
    }
}

$newuser = new vB_DataManager_User($vbulletin,ERRTYPE_ARRAY);
$newuser->set_userfields(array('field12' => 1)); // it doesn't work (with no errors).

...你应该得到这个:

致命错误:无法通过引用传递参数 1

如果您不这样做,则表示您尚未在开发框中启用完整的错误报告。它与方法的存在无关,无论如何都会触发错误:

致命错误:调用未定义的方法 vB_DataManager_User::not_valid()

【讨论】:

  • 谢谢,我已经通过 ini_set() 启用 display_errors 解决了。
【解决方案2】:

如果您尝试在第一个示例中设置用户名,您可能应该这样做:

$newuser->set_userfields(array('username' => 'MyUsername'));

不是这个:

$newuser->set_userfields(array('field12' => 1));

正如其他人所指出的,调用不存在的方法将引发致命错误。因此,该方法正在被调用,但并没有像您认为它正在做的那样做。根据您所写的内容,可能设置了错误的字段。

VBulletin Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多