【发布时间】:2015-06-14 15:29:25
【问题描述】:
我有一个 WordPress 插件,它有 2 个扩展类,Area 和 Loc,每个类都有一个辅助函数 Get。每个类都有 table_name 的静态变量。如果我直接调用 Loc::Get($id) ,它会按预期工作。但是,如果我从 Area 调用 Loc::Get($id),它会使用来自 Area 而不是 Location 的 table_name。
谁能解释一下如何纠正这个问题?问候,
class _Base {
function Get($id) {
$instance = new self();
$sql = "SELECT * FROM " . static::$table_name . " WHERE id=$id";
return $sql;
}
}
class Area extends _Base {
static $table_name = "Area";
function getLoc($id) {
$sql = Loc::Get($id);
return $sql;
}
}
class Loc extends _Base {
static $table_name = "Loc";
}
$sql = Area::Get(1); // -> "SELECT * FROM **Area** WHERE id=1"
$sql = Loc::Get(1); // -> "SELECT * FROM **Loc** WHERE id=1"
$sql = $area->GetLoc(1); // -> "SELECT * FROM **Area** WHERE id=1"
【问题讨论】:
-
您想阅读一些关于“后期状态绑定”的内容(有时也简称为“后期绑定”)。对于手头的问题:行为确实有意义:两个派生类都定义了相同的静态变量。在
Area的范围内,该值显然是“区域”。您调用的方法也在Area类的范围内执行,因此将选择表名,因为该函数访问当前范围内定义的静态变量。 -
您到底想要什么?另外,您的预期结果是什么,请告诉两者。谢谢
-
@anantkumarsingh 我想说你的两个问题都在上面的 OPs 问题中得到了明确的回答......他希望使用表名“Loc”,但事实并非如此。
-
作为一种解决方案,您可以将静态变量作为附加参数传递给
Get()方法,或者在每个类中重新定义该方法,或者为该方法实现后期状态绑定。跨度> -
您在父类 Base 中的何处声明了 $table_name 变量?
标签: php wordpress static extends