簡體   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