为什么$这不是正确的对象类型?

时间:2014-06-03 13:51:41

标签: php oop medoo

我正在尝试将一个简单的PHP数据库框架(Medoo)实现到PHPLib中,但我仍然坚持以下内容:

我有这个结构

index.php启动

  • new medoo object
  • 新申请对象

应用程序类处理每个应用程序的常规设置,并从我的medoo类扩展。

每个应用都有自己的类(例如Foo)和foo / app.php文件。 foo类从应用程序类扩展而来。 foo / app.php文件生成视图,并在此文件中创建一个foo对象。

但它在Foo类中我正在尝试使用medoo类连接我的数据库。 medoo类有一些受保护的属性,可以在Foo类中访问 (例如$ this-> medoo_property)

但无论何时我正在尝试运行使用medoo类中的方法,我都会遇到此错误: 致命错误:在某个非对象中调用成员函数something()

当我在medoo类中的错误之前执行$ this的var_dump时,它表示它是一个Foo对象而不是Medoo对象。所以很明显它抛出了非对象的错误,因为它试图在Foo对象中使用medoo属性。

我有同样的错误实现另一个PHP(PDO)类,所以错误是在我身边,但我无法弄清楚它是什么我做错了。 我希望我的问题得到妥善解释,如果需要可以随时提出更多信息。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

我认为,根据您提供的代码和说明,您面临的范围问题。

如果您在$this课程中致电Foo,则不会返回Medoo(家长)班级,$this在这种情况下指的是Foo的直接实例。所以你要调用一个没有给出的功能。正如你所说的那样。

您需要的是PHP中的Parent函数,因此您可以在Medoo中调用Foo中的函数。

作为官方文件中的简单例子:

<?php
class A {
    function example() {
        echo "I am A::example() and provide basic functionality.<br />\n";
    }
}

class B extends A {
    function example() {
        echo "I am B::example() and provide additional functionality.<br />\n";
        parent::example();
    }
}

$b = new B;

// This will call B::example(), which will in turn call A::example().
$b->example();
?>

此外,您不应将所有属性设置为public,这是一种不良做法和糟糕的范围。如果此类的孩子不能轻易访问它们,则应将它们设置为private;如果孩子应该访问和操作它们,则应将protected设置为{{1}}。

为了进一步保证这些属性的可访问性,您需要getter and setters

答案 1 :(得分:-1)

通过在medoo类中用self替换它并使属性静态

来修复它