我有一个带有方法saveToTable($ table)的类Bar,我需要为$ table设置一个默认值,但该值必须是动态的,动态值应该是Bar扩展到的类的名称。
class Bar {
public function saveToTable($table) {
}
}
class Foo extends Bar {
}
$bar = new Foo;
$bar->saveToTable(); // in which case saveToTable() would have a param of 'foo' i.e. saveToTable('foo');
我目前使用的解决方案是在扩展Bar的每个类中明确指定$ table属性,并为其分配这些类的字符串值。名称,但这会使我的应用程序动态失败的目的,加上它会非常麻烦,容易出错。
答案 0 :(得分:1)
你可以使用late static binding来引用扩展类
将此方法添加到Bar
类
class Bar{
public function getClassName()
{
return static::class;
}
}
现在你可以得到名字
$bar = new Foo();
$bar->getClassName(); // returns Foo
答案 1 :(得分:0)
不使用具有默认值的参数(不能动态分配) 考虑使用像这样的东西:
class Bar {
protected $classname;
public function __construct() {
$this->classname = static::class;
}
public function saveToTable() {
echo $this->classname;
}
}
现在在saveTotable()里面,你的类名是字符串。
class Foo extends Bar {
}
$bar = new Foo;
$bar->saveToTable(); // will echo 'Foo'
答案 2 :(得分:0)
另一个解决方案,注意命名空间,也许你需要删除
class Bar
{
public function saveToTable()
{
//Without namespace
$table = substr(static::class, strlen(__NAMESPACE__) + 1);
//With namespace
$table = static::class;
}
}
class Foo extends Bar
{
}
$bar = new Foo;
$bar->saveToTable();