4

我猜真的很简单,但为什么下面的不起作用?我猜这是一个范围的事情,从 class1 中看不到 class2。是的,我收到“调用非对象的成员函数”错误。

class class1 {
    function func1() {
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}

$class1 = new class1();
$class2 = new class2();

$class1->func1;

如果有人能给我解决这个问题,我将不胜感激。我已经搜索了一段时间,但我得到了很多其他人试图在其他类和类似的类中实例化新类的例子,而不是我遇到的这个特殊问题。

你会认为我在课堂上没有做很多事情是对的!

4

4 回答 4

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();
于 2012-09-30T16:42:35.710 回答
2

我建议您看一下静态函数/属性。基本上你不需要实例化class2,你只需要将其中的函数定义为静态的。看看下面的实现:

<?php
class class1 {
    function func1() {
        class2::func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    public static function func3() {
        echo "hello!";
    }
}

$class1 = new class1();

$class1->func1();

?>

尽可能避免实例化对象总是很好的。

于 2012-09-30T16:43:22.087 回答
0
class class1 {
    function func1() {
        //Initialize before using it.
        $class2 = new class2();
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}
于 2012-09-30T16:39:23.523 回答
0

两件事情:

在函数调用中添加括号并使用 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
于 2012-09-30T16:41:02.140 回答