在Child构造函数中实例化一个类;访问父母

时间:2013-09-12 23:31:07

标签: php class inheritance

假设你有这段代码:

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 个答案:

答案 0 :(得分: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,启动再一次)。

答案 1 :(得分:0)

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

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

public static function myGenericSQLMethod($sql){
parent::myGenericSQLMethod($sql);
//do other stuff
}

答案 2 :(得分: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();

度过愉快的一天。

答案 3 :(得分:0)

这是新对象的推荐声明。

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

PHP手册写一下;

  

如果子类,则不会隐式调用父构造函数   定义构造函数。为了运行父构造函数,调用   子构造函数中的parent :: __ construct()是必需的。如果   child没有定义构造函数,那么它可能会继承自   父类就像普通的类方法(如果它没有声明   作为私人)。

此外,受保护的函数只能在同一个类中调用,或者可以通过扩展从父类调用。但实际上,我并不确切地知道这样写的真正目标是什么。