我猜是非常简单,但为什么以下不起作用?我猜这是一个范围的东西,其中class2在class1中是不可见的。是的,我正在“调用非对象上的成员函数”错误。
class class1 {
function func1() {
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1;
如果有人能帮我解决这个问题,我将非常感激。我一直在寻找一段时间,但我得到了很多其他人试图在其他类和类似的实例化新类的例子,而不是我有这个特殊的问题。
你认为我不会对课程做很多事情你是对的。
答案 0 :(得分:7)
PHP不像JavaScript那样冒泡,所以你的$class2
未定义:
变量的范围是定义它的上下文。在大多数情况下,所有PHP变量只有一个范围。此单一范围跨越包含和所需文件[...]在用户定义的函数中引入了本地函数范围。函数内使用的任何变量默认限制为本地函数范围。
来源:http://php.net/manual/en/language.variables.scope.php
换句话说,PHP中只有全局范围和函数/方法范围。因此,要么将$class2
实例作为协作者传递给方法
class class1
{
function func1($class2) {
$class2->func3();
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1($class2);
或通过构造函数注入它:
class class1
{
private $class2;
public function __construct(Class2 $class2)
{
$this->class2 = $class2;
}
function func1()
{
$this->class2->func3();
}
}
$class2 = new class2();
$class1 = new class1($class2);
$class1->func1();
答案 1 :(得分:2)
我建议你看一下静态函数/属性。 基本上你不需要实例化class2,你只需要将其中的函数定义为static。看看以下实现:
<?php
class class1 {
function func1() {
class2::func3();
}
function func2() {
$this->func1();
}
}
class class2 {
public static function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class1->func1();
?>
尽可能避免实例化对象总是很好。
答案 2 :(得分:0)
class class1 {
function func1() {
//Initialize before using it.
$class2 = new class2();
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
答案 3 :(得分:0)
两件事:
为函数调用添加括号&amp;使用global将变量放入范围
class class1 {
function func1() {
global $class2; // Get variable into scope
$class2->func3();
}
function func2() {
$this->func1();
}
}
class class2 {
function func3() {
echo "hello!";
}
}
$class1 = new class1();
$class2 = new class2();
$class1->func1(); // Add brackets for function call