Php 在子构造函数中实例化类;在父级中访问

Php 在子构造函数中实例化类;在父级中访问,php,class,inheritance,Php,Class,Inheritance,假设您有以下代码: Class Dog extends Animal { __contruct() { $this->class = new self; } protected function bark() { echo "BARK BARK RUFF RUFF!"; } } 然后在父类中执行此操作 Animal { protected $class protected function myMe

假设您有以下代码:

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

    protected function bark() {
       echo "BARK BARK RUFF RUFF!";
    }
}
然后在父
类中执行此操作

Animal {

     protected $class

     protected function myMethod() {
         $class->bark();
     }
}
这段代码中可能有一些无关的错误,因为我只是在飞行中编出来的;但我在这里谈论的是主要问题

我在一个项目中有这样的代码,我得到:
致命错误:对非对象调用成员函数()。

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

编辑

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

考虑一下:

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;

。。。导致
内存不足
错误,因为构造函数中的
新self
调用导致错误递归(因为每个新的
新self
表达式将调用
\uu构造
,再次启动它)。

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

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

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

请尝试这个代码,它的工作和结果是:树皮-树皮-拉夫

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();

祝你有愉快的一天。

这是新对象的推荐声明

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

PHP手册写的关于

如果子类 定义一个构造函数。为了运行父构造函数,调用 父项::\子构造函数中的构造函数()是必需的。如果 子级未定义构造函数,则可以从 父类与普通类方法一样(如果未声明 作为私人)


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

你有$class->bark;谢谢,不过上面看起来像是我的假代码。在我的项目中没有。哎哟,这是个愚蠢的错误。无论如何,我改变了这一点,现在:
在不在
中的对象上下文中使用$this,然后我真的无法理解您想要做什么。)我的观点是,访问在子类中的父类上定义的受保护属性不是问题。我在问题中添加了真实的应用程序。好吧,我希望正确地执行此操作(如果这是错误的做法,则不要在父类中提出子类)。我应该在子类中有一个类似命名的方法来调用父方法,但添加特定信息吗?如果你阅读了我上面的应用程序——假设这是一种合法的亲子关系,你就会看到这种困境。为什么,是的,这是一种很正常的情况:孩子应该知道自己的父母。它可能不知道所有内容(这就是
private
properties的用途),但一般来说,从子类中调用父类方法(使用
parent::%methodName%()
符号)是可以的。因此,将其添加到子类并在那里调用它?如果您在子类中添加了类似于上述内容的内容,它将使用相同的名称调用父级中的方法。。这是正确的。