假设你有这段代码:
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)
时,该方法实际上在父代表中。我正在做的是尝试实例化在子的构造函数中,然后在父级中访问它。
答案 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没有定义构造函数,那么它可能会继承自 父类就像普通的类方法(如果它没有声明 作为私人)。
此外,受保护的函数只能在同一个类中调用,或者可以通过扩展从父类调用。但实际上,我并不确切地知道这样写的真正目标是什么。