gpt4 book ai didi

php - 如何在实例范围内从父类调用同名方法

转载 作者:行者123 更新时间:2023-12-04 03:15:55 26 4
gpt4 key购买 nike

我有带有函数 hi() 的父类 c1。类 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 是我的自定义数据库类
和 hi() 是 commit()
我希望能够调用 db::commit(),所以我不需要编写 db::i()->commit();

编辑:PHP < 5.3

最佳答案

通常调用类的父方法的方法是使用 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 .

我不认为试图变得聪明并强制代码执行双重任务是一种好的做法。此外,您不应该太喜欢复杂且难以阅读或修改的单行函数。程序员喜欢过于紧凑的代码是很常见的,但您会发现它使代码难以维护。项目需求不可避免地会发生变化,无论如何,您最终都必须拆开您的单行 gem 。

关于php - 如何在实例范围内从父类调用同名方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3126740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com