一个类能否实例化另一个类?(PHP)

3

我尝试这样做,但是当我在“second”类内实例化“first”类时出现错误。

“second”类内的注释部分会导致错误。

class first {
    public $a;

    function __construct() {
        $this->a = 'a';
    }
}

class second {
    //$fst = new first();
    //public showfirst() {
        //$firsta = $this->first->a;
    //  echo "Here is first \$a: " . $firsta;
    //}
}

编辑:

尽管“second”类中只有“first”类的实例化,但这导致服务器错误。

class second {
    $fst = new first();
    //public showfirsta() {
    //  $firsta = $this->fst->a;
    //  echo "Here is first \$a: " . $firsta;
    //}
}

那个 $fst 似乎是从无处创造出来的。 - BoltClock
是啊,那又怎样?我不能创建一个 $fst,它是 first 类的一个新实例吗?那正是我想做的。 - Buttle Butkus
在实例化另一个类时没有问题,只需要使用正确的变量引用它...例如$firsta = $fst->a。first()的对象被分配给了$fst,而不是$this->first。 - Damien Pirsy
谢谢,那是我的错误,但根本错误出现在类实例化阶段。请查看我的编辑。$fst = new first(); 完全无法工作。 - Buttle Butkus
1
因为你不能在声明类变量时创建对象;请参见我的答案。 - Damien Pirsy
可能是PHP属性作为对象的重复问题。 - Gordon
3个回答

11

试试这个:

class First {
    public $a;

    public function __construct() {
        $this->a = 'a';
    }

    public function getA() {
      return $this->a;
    }
}

    class Second {
        protected $fst;
        public function __construct() {
          $this->fst = new First();
        }

        public function showfirst() {
           $firsta = $this->fst->getA();
           echo "Here is first {$firsta}";
        }
    }

    $test = new Second();
    $test->showfirst();

这个很好用!但是为什么你在echo语句里把$firsta放在{}里面? - Buttle Butkus
你可以使用它们来插入变量表达式。但在这种情况下,当然也可以不用。https://dev59.com/QXE85IYBdhLWcg3w03Dz - busypeoples

7
$fst = new first();

在函数之外,您不能声明一个实例化新类的变量。默认值不能是变量,必须是字符串、数字或可能是数组。对象是被禁止的。

public showfirst() {

你忘记在那里添加 function 这个词了。

    $firsta = $this->first->a;

您没有声明类变量$first。您将其命名为$fst并且将其引用为$this->fst。请注意,$first应该更改为$fst以匹配您的引用。
    echo "Here is first \$a: " . $firsta;
}

针对你的目的(无论是什么):

class second {
    public function showfirst() {
        $fst = new first();
        $firsta = $fst->a;
        echo "Here is first \$a: " . $firsta;
    }
}

1
在你的例子中,$fst 实例会在函数执行完毕后立即消失,对吗?如果我需要在类中进行其他操作,该怎么办呢?是的,你说得对,我确实犯了一些错误,比如缺少 "function" 关键字等。 - Buttle Butkus

4

您可以在另一个类中实例化一个类。在您的情况下,在两个示例中,您不断地引用错误的变量。此外,您不能在属性声明中分配一个类:

class second {

    public $fst;

    public function showfirsta() {
    $this->fst = new first();
    $firsta = $this->fst->a;
    echo "Here is first \$a: " . $firsta;
    }
}

似乎很奇怪,你不能立即将变量初始化为另一个类的实例。但这确实解决了问题。此外,这个类实例会随着调用对象的销毁而消失,对吗? - Buttle Butkus
你的意思是什么?无论如何,你总是可以返回实例:return $this->fst。如果你把实例化放在构造函数中,那么一旦类被实例化,它就会被分配;然后你就可以在整个类中使用 $this->fst 了。 - Damien Pirsy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接