【问题标题】:how i can make find method does not make a problem我怎样才能使查找方法没有问题
【发布时间】:2021-05-24 11:10:07
【问题描述】:

我创建了一个 Depot 类。当我从此类创建对象时,我使用 find 方法查找具有 id 的特殊项目。

之后我不能调用任何其他方法。

我不使用 Laravel

// index.php file
$depot = new Depot();
$depot = $depot->find(2);
var_dump($depot->hi());

致命错误:未捕获错误:调用未定义方法 stdClass::hi()

hi 方法用于测试。

// model.php file
class Model {
// ...
public function find(int $id)
    {
        $statement = $this->pdo->prepare("select * from {$this->table} where id = :id");
        $statement->execute(compact('id'));
        $obj = $statement->fetch(PDO::FETCH_OBJ);
        return $obj;
    }
}
class Depot extends Model {
//...
public function hi()
    {
        echo "hi";
    }

}

【问题讨论】:

  • find() 在这种情况下返回调用PDOStatement::fetch() 的结果,我不希望有一个方法hi() - 你用这个结果替换$depot。这似乎不是您的意图 - 检查您用于存储结果的逻辑,并确保它符合您的要求。

标签: php oop backend


【解决方案1】:

用这一行:

$depot = $depot->find(2);

您正在用查询结果覆盖代表您的对象的变量$depot。返回的对象(不出所料)不包含名为 hi() 的函数。

我不知道这是否只是一个错字,但如果不是,如果您重复使用相同的变量来包含两个完全不同的东西,这通常是代码质量不佳的标志。它会导致维护和可读性问题,并且通常会导致进一步的错误,例如这个错误,您错误地认为变量仍然具有其原始内容。 PHP 等弱类型语言特别容易出现这种错误。最简单的事情就是制定一条永远不要这样做的规则。

将结果分配给不同的变量,例如

$depot = new Depot();
$findResult = $depot->find(2);
$depot->hi();

将解决问题。

(另外var_dump() 是不必要的,因为hi() 已经包含回声。)

【讨论】:

  • 虽然这会阻止错误,但它会使find() 调用毫无意义。我假设他们想将数据库中的值检索到 Depot 类型的对象中
  • @NigelRen 也许?它并没有在任何地方这么说,而且如果确实如此,那也远非显而易见。当然,代码不会尝试将 PDO 结果转换为Depot 对象。 OP需要澄清是否是这种情况。我认为这是一个错字或对返回类型的误解。此外,他们已经声明了 Depot - 尚不清楚 find 是否应该填充它所属的对象而不是返回原始结果集。如果它打算返回一个新的 Depot 对象,那么它应该是 static 真正的 IMO。
  • 我想查找 id 为 2 的项目并获取相关产品,例如:$depot->products();
  • @Mesh 并没有真正解释与这种情况有关的任何具体内容。你能更清楚地知道究竟应该发生什么吗?
【解决方案2】:

试试这个

$depot = new Depot();
$depotDb = $depot->find(2);
var_dump($depot->hi());

【讨论】:

  • 这有什么帮助?您现在忽略返回值,无法找到任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多