为什么与自动调用的类名称相同的方法?

时间:2015-08-23 21:31:22

标签: php oop object

编辑:编辑标题以使其更有用。最初我不知道使用共享单词导致问题。

这是非常基本但相当神秘。

我有两个班级:

class Hello
{
        public function hello()
    {
        echo "Hello";
    }
}

class World
{
    public function world()
    {
        echo " World";
    }
}    

通过

调用
include_once 'classes/Hello.php';
include_once 'classes/world.php';

$hi= new Hello;    
$wd= new World;`

结果Hello World

我最初意外地使用hello作为班级World方法的名称。 结果Hello,即没有World

问题1

为什么这些方法会被解雇?我已经实例化了两个对象,但没有请求该方法“触发”。我以为我必须这样做:

$hi->hello();

获得输出。

问题2

我更加神秘的是,如果两个函数都被称为hello,我只会得到Hello。

当然

$hi= new Hello;
$wd= new World;

实例化两个完全独立的对象。那么方法的实际NAME如何影响任何东西呢?

我还有很长的路要走,但这让我很困惑。

1 个答案:

答案 0 :(得分:9)

当您创建此类的新实例时,会调用这两个方法,因为这些方法与类本身具有相同的名称,因此它们是此类的constructor

class Hello
{
        public function hello()
    {
        echo "Hello";
    }
}
class World
{
    public function world()
    {
        echo " World";
    }
}

因此,当您从两个类中获取实例时,两个构造函数都被调用。


现在,当您将两个方法重命名为hello时,只有1个方法被计为构造函数,另一个方法是另一个类中的常规方法。这就是为什么你只看到Hello作为输出的原因。

但是不要使用类的名称作为构造函数! It will be deprecated in PHP 7.使用__construct()