繁体   English   中英

从另一个类中调用PHP类

[英]Calling a PHP class from within another class

非常简单,我猜,但为什么以下不起作用? 我猜这是一个范围的东西,其中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;

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

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

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();

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

?>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM