如我所知,在第一个示例中创建了一个对象,而在第二个示例中,我没有看到创建的对象。我试图理解,这两种方法调用之间有什么区别:
<?php
class Animal{
public $voice;
public function speak($sound){
echo $this->voice = $sound;
}
}
// Example 1
$tiger = new Animal();
$tiger->speak('Roar');
// Example 2
(new Animal)->speak("Cloak Cloak");
答案 0 :(得分:2)
无论何时使用“ new”,都在创建对象的实例(它可以是临时的)。您的代码的不同之处在于,在第一个示例中,您将实例存储在“ $ tiger”中,因此它将持久存在,但是在第二个示例中,您仅实例化了一个临时对象来调用方法。>
答案 1 :(得分:0)
在第一个示例中,您将变量$ tiger分配为新对象,然后您可以通过引用$ tiger来调用与该对象关联的函数和变量。
即因为老虎现在等于动物类的物件,所以它可以说话。
但是,在第二个示例中,您仍在创建动物类的新对象,因此它可以说话-但尚未将其分配给变量。因此,您不能再引用同一对象。
因此,在第一个示例中,如果我们想命名$ tiger,我们可以让Class看起来像这样。
class Animal{
public $voice;
public $name = "I have no name.";
public function speak($sound){
echo $this->voice = $sound;
}
public function sayYourName(){
echo $this->name;
}
}
现在,如果我们说
$tiger = new Animal();
$tiger->speak('Roar');
$tiger->name = "Rory";
$tiger->sayYourName(); // This will echo "Rory"
但是,如果您尝试第二个示例:
(new Animal)->sayYourName(); // This will echo "I have no name."
所以,如果您说:
(new Animal)->name = "Rory";
(new Animal)->sayYourName(); // This will still echo "I have no name".
这是因为我们尚未分配对新动物的引用,因此尽管我们可以访问函数的方法,甚至可以访问预定义的变量,但以后不能再次引用它们。
要做到这一点,我们应该坚持第一种方法(即引用)
$tiger = new Animal();
$tiger->name = "Rory";
$tiger->sayYourName();
最后,请稍后使用引用来引用对象。即要引起动物的注意,您必须用动物的名字来称呼它。