我正在尝试将一个简单的PHP数据库框架(Medoo)实现到PHPLib中,但我仍然坚持以下内容:
我有这个结构
index.php启动
应用程序类处理每个应用程序的常规设置,并从我的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)类,所以错误是在我身边,但我无法弄清楚它是什么我做错了。 我希望我的问题得到妥善解释,如果需要可以随时提出更多信息。
任何帮助都非常感激。
答案 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替换它并使属性静态
来修复它