我有父类c1,函数为hi()。 class c2扩展了c1并通过方法i()包含单例访问。在类c2中,我想创建与c1中相同名称的方法,我可以在静态范围内调用它,但在这种方法中,我不得不使用单例实例和父类中具有相同名称的调用方法。
class c1{
function hi(){
echo 'very '.$this->a;
}
}
class c2 extends c1{
private static $i;
public static function i() {
return (self::$i)?self::$i:(self::$i = new self);
}
public $a='cool';
function hi(){
self::i()->hi(); // here I want to call hi() from c1 but in instance scope
}
}
c2::hi(); //must echo: very cool
在实例中
c1是mysqli
c2是我的自定义db类
和hi()是commit()
我希望能够调用db :: commit(),所以我不需要编写db :: i() - > commit();
编辑:PHP< 5.3
答案 0 :(得分:2)
通常,调用类的父方法的方法是使用parent::
关键字,但这只适用于在实例范围内运行而不是在静态范围内运行。
但是你不能将hi()作为静态函数和非静态函数运行。
class c1
{
function hi() {
echo 'very '.$this->a;
}
}
class c2 extends c1
{
private static $i;
public static function i() {
return (self::$i)? self::$i: (self::$i = new c2());
}
public $a='cool'; // not static
function hi() {
parent::hi();
}
static function do_hi() {
$i = self::i();
$i->hi();
}
}
c2::do_hi(); // echoes: very cool
补充评论:奇怪的是,PHP允许您使用::
语法调用实例方法,就好像它们是静态方法一样。在我看来,这是错误的,它会导致令人困惑的代码。你应该假装这种用法是不可能的,而只是在你声明它们static
时静态调用函数。
我认为试图聪明并强制执行双重任务代码是一种很好的做法。此外,您不应该太喜欢复杂且难以阅读或修改的单行函数。程序员通常喜欢过于紧凑的代码,但你会发现它使代码很难维护。项目要求不可避免地会发生变化,无论如何你最终都不得不拆开你的单线宝石。
答案 1 :(得分:2)
你可以静态呼叫mysqli_commit:
parent::commit();