【问题标题】:What's the equivalent of virtual functions of c++ in PHP?PHP中c++的虚函数等价物是什么?
【发布时间】:2011-01-30 01:41:43
【问题描述】:

abstract function xxx吗?

我刚刚做了一个测试,似乎表明私有方法也是虚拟的?

class a {
 private function test()
 {
  echo 1;
 }
}

class b extends a {
 private function test()
 {
  echo 2;
 }
 public function call()
 {
  $this->test();
 }
}

$instance = new b;
$instance->call();

输出为2

【问题讨论】:

    标签: php virtual abstract


    【解决方案1】:

    在 PHP 中,所有私有函数都是虚拟的,因此无需显式将它们声明为虚拟。

    将成员函数声明为abstract 仅仅意味着基类不能提供实现,但所有派生类都应该提供。将方法定义为抽象方法与在 C++ 中执行以下操作相同

    virtual void foo() = 0;
    

    这仅仅意味着派生类必须实现foo();

    编辑:关于已编辑的问题

    b::call() 无法访问 a::test()。因此,在调用私有函数时,只会调用调用它的类中的那个。

    编辑: 关于评论:

    (来自维基百科)

    在面向对象的编程中,虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖。

    由于明确说明您在 C++ 中支付的费用的想法,您必须将函数声明为虚拟函数以允许派生类覆盖函数。

    class Foo{
    public:
        void baz(){
            std::cout << "Foo";
        }
    };
    class Bar : public Foo{
    public:
        void baz(){
            std::cout << "Bar";
        }
    };
    
    int main(){
        Foo* f = new Bar();
        f->baz(); //baz is not virtual in Foo, so the output is Foo
    }
    

    将 baz 更改为虚拟

    class Foo{
    public:
        virtual void baz(){
            std::cout << "Foo";
        }
    };
    //Same Bar declaration
    
    int main(){
        Foo* f = new Bar();
        f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function
    }
    

    注意,如果上面示例中的变量 fBar*Bar 类型,那么 Foo::baz() 是否为虚拟都没有关系,因为预期的类型是已知的(程序员明确提供了它)

    【讨论】:

    • 感谢演示,我现在明白虚是什么意思了。但是你也可以用PHP证明吗?因为在PHP中似乎不可能将对象转换为基类,换句话说,有PHP中没有virtual这样的概念吗?
    • php中没有virtual这个概念。或者反过来说,每个方法都是虚拟的,因为实际实现是在运行时查找的。​​span>
    • 我认为PHP中没有虚拟概念会更好,因为用这种语言不可能做到这一点:Foo* f = new Bar();
    • 但是你有instanceof 和覆盖方法的能力。
    【解决方案2】:

    该示例没有显示典型的专业化模式,其中 b 不需要知道 call() 的实现细节,但可以指定如何完成 test()。不幸的是,它确实返回了1。但是,通过将函数声明为受保护而不是私有,它将按预期工作。

    class a {
        protected function test()
        {
            echo 1;
        }
        public function call() {
            $this->test();
        }
    }
    
    class b extends a {
        protected function test()
        {
          echo 2;
        }
    }
    
    $instance = new b();
    $instance->call();
    

    【讨论】:

      【解决方案3】:

      使用静态关键字 (php 5.4) 不是 $this->meth() 但 静态::meth()

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多