0

假设您有以下代码:

Class Dog extends Animal {
    __contruct() {
         $this->class = new self;
    }

    protected function bark() {
       echo "BARK BARK RUFF RUFF!";
    }
}

然后在父母Class你这样做

Animal {

     protected $class

     protected function myMethod() {
         $class->bark();
     }
}

这段代码中可能有不相关的错误,因为我只是在飞行中编造的;但我在这里谈论的主要问题。

我在一个项目中有这样的代码,我得到:Fatal error: Call to a member function <myFunction>() on a non-object ...

这是像这样从父级访问子类的正确方法吗?

编辑

真正的应用是这样的:我有一个 MySQL 数据库。我有一个具有通用全局函数的父类;我有它的子类,其中包含特定的表数据,如表名、字段等。因此,当我调用此代码时 TableClass::myGenericSQLMethod($sql),该方法实际上在父类中。我正在做的是尝试在子构造函数中实例化,然后在父构造函数中访问它。

4

4 回答 4

2

考虑一下:

class Animal {
    public function myMethod() {
        $this->bark();
    }
}

class Dog extends Animal {
    protected function bark() {
       echo "BARK BARK RUFF RUFF!";
    }
}

$x = new Dog;
$x->myMethod();

这虽然不是一个出色的架构(一般来说,父类不应该知道任何关于它的子类),但确实有效。


但是,这不会:

class A {
    protected $foo;
}

class B extends A {
    public function __construct() {
        $this->foo = new self;
    }
}
$a = new B;

...导致Out of memory错误,因为new self在构造函数中调用导致错误的递归(因为每个新new self表达式都会调用__construct,重新启动它)。

于 2013-09-12T23:33:02.177 回答
0

TableClass::myGenericSQLMethod($sql) 是一个静态方法。

假设在父级中您有一个类似命名的静态方法,您可以在 TableClass::myGenericSQLMethod 的主体中调用它。

public static function myGenericSQLMethod($sql){
parent::myGenericSQLMethod($sql);
//do other stuff
}
于 2013-09-12T23:49:10.267 回答
0

请尝试此代码,它可以工作,结果是:BARK BARK RUFF RUFF!

Class Dog extends Animal {
    public function __contruct() {
         $this->class = new self;
    }

    protected function bark() {
       echo "BARK BARK RUFF RUFF!";
    }
}
//Then in parent Class you do this

class Animal {

     protected $class;
    public function user()
    {
        $this->myMethod();
    }
     protected function myMethod() {
         $this->bark();
     }
}
$an = new Dog();
$an->user();

祝你今天过得愉快。

于 2013-09-12T23:50:13.700 回答
0

这是新对象的推荐声明。

在创建新对象时,$this->class 直接声明为实例并立即使用。

PHP手册写一下;

如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用 parent::__construct()。如果子类没有定义构造函数,那么它可以像普通类方法一样从父类继承(如果它没有声明为私有)。

此外,受保护的函数只能在同一类内部或通过扩展从父类调用。但实际上,我不知道这样写的真正目标是什么。

于 2013-09-13T00:20:24.053 回答