【问题标题】:How can I call on a parent method from outside the class?如何从类外调用父方法?
【发布时间】:2014-01-02 07:08:15
【问题描述】:

举个例子:

class A implements Serializable {
    serialize() {}
}
class B extends A {
    serialize() {}
}

A 类是在每个页面上使用的持久但最小的类。 B 类是临时管理员(在设置屏幕上使用)类,它通过读取文件来填充成员。

我需要将对象序列化并存储在数据库中两次,一次用于常规页面,第二次(寿命有限)用于管理页面。

$instance = new B(); // and populate
$data = serialize( $instance );

这将始终调用被覆盖的方法。有什么方法可以将$instance 转换为A,以便调用class A 的序列化方法?

【问题讨论】:

  • 如何发送一个令牌而不是强制转换并从 B 的方法中检查它以检查是否被调用 A 的方法
  • @silentboy 您不能在序列化的同时发送其他参数。已经试过了。
  • 用另一种方法包装它。
  • 重写方法的全部意义在于阻止你想要做的事情。当从类外部调用该方法时,将调用该方法的覆盖版本。当然,您可以在子类中创建一个完全不同的方法,除了通过parent::serialize(); 调用您想要调用的父方法之外什么也不做
  • @santosh,我向派生类添加了一个新方法并使其调用父类。 TBH 我不记得为什么我需要这个功能。我想我是在尝试模仿 C++ 类的多态性。

标签: php inheritance casting


【解决方案1】:

答案是否定的,你不能。子级重新声明该方法的父级功能并完全覆盖它。为此,需要使用静态方法。

【讨论】:

  • 考虑到该类仍然维护一个 vtable,我认为这样做会有一些技巧。
【解决方案2】:

可以通过创建一个闭包,看下面sn-p进行演示

<?php

interface Greeting
{
    public function hello();
}

class A implements Greeting
{
    public function hello()
    {
        echo "Say hello from A\n";
    }
}

class B extends A
{
    public function hello()
    {
        echo "Say hello from B\n";
    }
}

$b = new B();

$closure = function() {
    return parent::hello();
};

$closure = $closure->bindTo($b, 'B');
$closure(); // Say hello from A
$b->hello(); // Say hello from B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2020-01-14
    • 2012-02-22
    • 1970-01-01
    • 2014-06-11
    • 2014-04-29
    相关资源
    最近更新 更多