在将类实例化为实例时,可能会注意到,有时候类后面加了括号,而有时又没有加括号,两者到底有什么区别呢?

我们先看一个示例:

class Person
{
    public function sayHello()
    {
        echo 'Hello';
    }
}

$person1 = new Person;
$person1->sayHello(); // Hello

$person2 = new Person();
$person2->sayHello(); // Hello

两者没有任何区别。

再看另外一个例子,如果构造函数中带有参数呢?

class Person
{
    protected $name;

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

    public function sayHello()
    {
        echo "Hello,  I am {$this->name}.";
    }
}

$bob = new Person;
$bob->sayHello();

$nancy = new Person('nancy');
$nancy->sayHello();

结果运行后报致命错误了:Fatal error: Uncaught ArgumentCountError: Too few arguments to function Person::__construct(), 0 passed.

因此得出的结论是:当类的构造函数中没有必填参数时,使用 new 创建实例可以省略括号;当构造函数有必填参数时,一定要加上括号并传递参数,否则会导致致命错误。