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

BeN*_*ice 5 php oop object

编辑:标题编辑,使其更有用.最初我不知道是使用了导致问题的共享单词.

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

我有两节课:

class Hello
{
        public function hello()
    {
        echo "Hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

class World
{
    public function world()
    {
        echo " World";
    }
}    
Run Code Online (Sandbox Code Playgroud)

叫做

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

$hi= new Hello;    
$wd= new World;`
Run Code Online (Sandbox Code Playgroud)

结果 Hello World

我最初不小心得到hello了班级World方法的名称.结果Hello即没有World.

问题1

为什么这些方法会被解雇?我已经实例化了两个对象,但没有请求方法"触发".我以为我必须做以下事情:

$hi->hello();
Run Code Online (Sandbox Code Playgroud)

得到一个输出.

问题2

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

一定

$hi= new Hello;
$wd= new World;
Run Code Online (Sandbox Code Playgroud)

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

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

Riz*_*123 10

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

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

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


现在,当您将两个方法重命名为hello仅1个方法时,将其视为构造函数,另一个方法是另一个类中的常规方法.这就是你只看到Hello输出的原因.


但是不要使用类的名称作为构造函数!它将在PHP 7中弃用.使用__construct().

  • 这是一个知识渊博的答案.我一直在想他已经遗漏了一些代码,但确实有道理.也好引用. (3认同)