Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个类中调用PHP类_Php_Oop - Fatal编程技术网

从另一个类中调用PHP类

从另一个类中调用PHP类,php,oop,Php,Oop,我猜这很简单,但为什么下面的方法不起作用呢?我猜这是一个范围问题,在这个范围内,class2从class1中是不可见的。是的,我收到“调用非对象上的成员函数”错误 如果有人能帮我解决这个问题,我将非常感激。我已经搜索了一段时间,但是我得到了很多其他人试图在其他类和类似类中实例化新类的例子,而不是我遇到的这个特殊问题 你认为我上课不多是对的 有两件事: class class1 { function func1() { //Initialize before using i

我猜这很简单,但为什么下面的方法不起作用呢?我猜这是一个范围问题,在这个范围内,class2从class1中是不可见的。是的,我收到“调用非对象上的成员函数”错误

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

你认为我上课不多是对的

有两件事:

class class1 {
    function func1() {
        //Initialize before using it.
        $class2 = new class2();
        $class2->func3();
    }
    function func2() {
        $this->func1();
    }
}

class class2 {
    function func3() {
        echo "hello!";
    }
}
在函数调用中添加括号&使用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

PHP不像JavaScript那样使用气泡镜,因此您的
$class2
未定义:

变量的范围是定义变量的上下文。大多数情况下,所有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();

我建议您看看静态函数/属性。 基本上,您不需要实例化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();

?>


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

$class1和$class是对象而不是类。对象是某个类的实例。您可以有许多对象使用同一个类。虽然这样做可行,但在OOP中强烈建议不要使用
global
关键字:
“尽量避免实例化对象总是很好的。”
为什么会这样?
尽可能避免实例化对象总是很好的。
坚持命令式编程,那么,建议不要在OOP中使用对象是没有意义的。在这个特定示例中,您甚至不需要实例化Class2,如果您认为静态调用/属性不是OOP概念,那么您似乎错了!这太棒了,我现在可以上我需要的课了,所以这是正确的位置,谢谢!还有一个问题,我现在有,但它是不合适的,不做一些研究,然后再问!再次感谢。
<?php
class class1 {
    function func1() {
        class2::func3();
    }
    function func2() {
        $this->func1();
    }
}

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

$class1 = new class1();

$class1->func1();

?>