这种方法调用方式有什么区别

时间:2018-11-22 12:33:33

标签: php oop

如我所知,在第一个示例中创建了一个对象,而在第二个示例中,我没有看到创建的对象。我试图理解,这两种方法调用之间有什么区别:

<?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");

2 个答案:

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

最后,请稍后使用引用来引用对象。即要引起动物的注意,您必须用动物的名字来称呼它。